先明确“只有一个节点执行 cronjob”的含义。**避免同时执行,与避免重复产生业务效果,是不同要求。**共享调度器协调执行,业务操作本身仍须经得起崩溃和重试。
假设每日开票任务部署在三个 NestJS 节点上。我们希望按计划执行,同时避免 worker 重启后多开一张发票。
1. 理解为什么所有节点都会启动任务
每个应用实例都注册自己的 cron 回调,到了时间便可能独立启动:
00:00 -> Node A -> invoice task
-> Node B -> invoice task
-> Node C -> invoice task
本地 isRunning 标志只存在于一个进程。NestJS 的 waitForCompletion 能阻止该实例回调重叠,但不能协调其他节点。三个节点各加同样标志,依然是三个独立决策。。
