分布式任务

单机延时队列可以靠一个调度线程推进任务,但生产系统通常需要多个调度器和多个执行器共同工作。分布式任务的核心问题是:多个节点如何分工,如何避免重复执行,某个节点挂掉后任务如何被其他节点接手。

本章会从任务抢占开始。调度器发现到期任务后,不能只把任务读出来就执行,而要通过状态更新、租约、版本号或分布式锁完成“声明执行权”。常见做法是把任务从 pending 更新为 running,同时写入 owner 和 lock_until;只有更新成功的节点才能执行,锁过期后其他节点可以接管。

分布式锁不是目的,任务正确性才是目的。锁可能超时、节点可能暂停、网络可能抖动,因此业务执行端仍然必须幂等。取消订单要检查订单是否仍未支付,发券要检查是否已经发过,退款要有业务流水号。延时队列最多保证尽量调度,最终效果必须由业务幂等兜底。

故障转移需要明确恢复路径。调度器宕机时,未取出的任务仍在等待队列;执行器宕机时,running 任务会在租约过期后被重新扫描;连续失败的任务进入重试队列或死信队列;积压严重时需要按业务优先级限流或扩容。所有这些行为都应该被监控看到,而不是依靠人工猜测。

完成本章后,你会把延时队列从单机组件提升为分布式平台:多节点可以并行调度,任务执行权有清晰边界,故障后能自动恢复,重复执行由锁和幂等共同控制,运维人员能通过指标判断系统是否健康。

章节