标准答案
- 幂等任务可以允许重复触发并在业务层去重,不能把“偶尔重复”当作设计。
- 租约或数据库锁可以选出当前执行者,但要设置过期、续租、释放和持有者校验。
- 可分片任务按时间、租户或数据范围拆分,并记录分片状态;单主调度适合集中编排但要处理主节点故障。
- 任务状态、执行记录和补偿机制必须持久化,避免实例重启后丢失窗口。
题目解析
多实例调度时,每个实例都可能观察到同一个时间窗口。即使通过租约让一个实例获得执行权,进程崩溃、网络分区和任务重试仍可能让业务动作执行多次,因此调度和业务幂等必须分开设计。
可分片任务适合按租户、时间或资源键拆分并持久化分片状态;不能分片的任务可以用租约或独立调度器,但要定义续租失败、接管和未完成任务恢复。
状态记录至少要能区分 scheduled、running、succeeded、failed 和过期租约。异常退出后要允许安全恢复,不能依靠进程内变量判断任务是否已经完成。
常见误区
- 误区:只用进程内锁防止多实例重复。改正:使用共享协调或持久化任务状态,并让最终业务写入具备幂等保护。
- 误区:租约没有 fencing 或过期处理。改正:租约接管后要让旧持有者的写入被版本或令牌拒绝。
- 误区:任务异常退出后状态永久 running。改正:记录租约期限和心跳,过期后进入可恢复状态并保留审计信息。