系统设计实战第 4 卷
系统设计实战

系统设计 - 延时队列

延迟任务
队列ZSet

从订单超时取消出发,构建覆盖延迟语义、数据库轮询、Redis ZSet、消息队列、时间轮和分布式调度的延时任务系统

系统演进路线

从 sleep 定时器到分布式延时任务平台

第 1 版

业务线程 sleep

订单 30 分钟未支付要取消,开发者先在代码里启动定时线程。

内存任务sleep订单回调

最容易理解,但进程重启、任务量和可观测性都不可接受。

第 2 版

数据库轮询

任务必须持久化,系统开始用表记录执行时间和状态。

任务表状态机索引扫描批处理

可靠性提高,但扫描成本和调度延迟会限制规模。

第 3 版

高性能调度

任务量上升到百万级,需要 Redis ZSet、MQ 或时间轮承接热任务。

Redis ZSet延迟消息时间轮分片队列

调度性能提升后,取消、重试和幂等仍要靠任务模型保证。

生产版

分布式延时任务平台

多个业务接入后,需要隔离、抢占、故障转移和死信治理。

租约锁执行器集群重试策略死信队列监控告警

生产级延时队列是调度、执行、恢复和业务幂等共同组成的系统。

当前架构
生产级延时队列
不同延时长度走不同存储和调度策略,统一由任务状态、监控和幂等消费兜底。
入口
任务 API
鉴权限流
参数校验
调度
短延时 ZSET
中长延时 DB
分布式调度器
执行
消费者集群
失败重试
死信队列
治理
监控告警
任务追踪
补偿任务

课程简介

延时队列解决的是“现在产生任务,将来某个时间点可靠执行”的问题。它看起来像一个简单定时器,但一旦进入生产环境,就会遇到任务持久化、执行幂等、重复消费、调度延迟、节点故障、任务积压和跨业务隔离等系统问题。

这门课以订单 30 分钟未支付自动取消为起点,逐步把一个临时脚本演进为生产级延时任务平台。

学习路线

  1. 开始:从真实事故理解延时队列为什么是基础设施,而不是业务代码里的 sleep
  2. 基本概念:建立延迟语义、任务模型、可靠性和幂等边界。
  3. 数据库轮询方案:用最容易落地的方案理解索引、批处理和扫描成本。
  4. Redis ZSet 方案:用分数表达执行时间,提升调度性能并处理多队列隔离。
  5. 消息队列延时方案:比较 RabbitMQ、Kafka 等方案在延迟任务中的能力和限制。
  6. 时间轮:理解高性能定时调度如何把大量任务分桶推进。
  7. 系统架构:整合存储、调度、执行、重试、监控和容量规划。
  8. 分布式任务:处理多调度器、锁、故障转移和任务重复执行问题。

读完后,你应该能判断不同延时任务方案适合什么规模和业务要求,并能设计一套可观测、可恢复、可水平扩展的延时队列系统。

第一章 / CHAPTER 01

开始

开始阅读