标准答案
- 定时器只属于本进程,重启、暂停和时钟变化都会影响触发。
- 可以把任务交给平台调度器和队列,或使用带租约和 fencing 的分布式调度。
- 任务本身仍要幂等、可恢复、可观测,并处理执行时间超过周期的重叠。
- 低价值任务可以允许重复但要限制并发,关键任务必须保存执行记录。
题目解析
setInterval 属于单个 Node 进程,多实例部署会让每个实例都触发;进程重启、暂停和事件循环阻塞还会造成漏触发、延迟或重叠执行。进程内 boolean 不能跨实例协调。
可以把触发交给平台调度器、队列或共享租约,但租约只解决谁尝试执行,任务本身仍要幂等、可恢复并处理执行超过周期的重叠。
周期任务要明确时区、夏令时、错过窗口、补跑和取消语义。数据库或调度器记录执行状态,才能在实例故障后判断是否接管。
常见误区
- 误区:用进程内 boolean 防多实例重复。改正:使用外部调度、共享租约或持久化幂等状态。
- 误区:任务执行超过周期仍无限并发。改正:设置重叠策略、租约和最大并发,必要时跳过或合并窗口。
- 误区:没有处理时区和夏令时。改正:使用明确的 IANA 时区、触发规则和错过窗口策略。