延时队列
· 阅读需 15 分钟
延时队列(Delayed Queue)是一种支持消息延迟消费的特殊队列,核心特性是:消息入队后不会立即被消费,而是等待指定的延迟时间后,才被推送到消费端处理。它区别于普通队列的“先进先出”,核心是按“延迟时间”排序并触发消费,是分布式系统中处理延时任务的核心组件。
一、延时队列核心概念
1. 核心定义
- 延迟时间:消息的“触发时间”(如“5分钟后执行”或“2024-05-01 10:00:00执行”);
- 触发条件:当系统时间达到消息的延迟时间阈值时,消息才会被消费;
- 有序性:延时队列内部通常按消息的触发时间排序,保证先到期的消息先被消费。
2. 与普通队列的区别
| 特性 | 普通队列 | 延时队列 |
|---|---|---|
| 消费时机 | 入队后立即可消费 | 延迟时间到期后才可消费 |
| 排序规则 | 按入队顺序(FIFO) | 按触发时间排序 |
| 核心场景 | 即时任务处理 | 延时/定时任务处理 |
二、延时队列的典型应用场景
延时队列解决了“非即时、定时/延时处理任务”的核心需求,是分布式系统中不可或缺的组件,典型场景包括:
1. 订单超时处理
- 场景:电商订单创建后,若用户未支付,需在30分钟后自动取消订单、释放库存;
- 实现:订单创建时,向延时队列发送“30分钟后取消订单”的消息,到期后消费消息执行取消逻辑。
2. 消息重试机制
- 场景:接口调用失败时,需按“指数退避策略”重试(如10s后第一次重试、30s后第二次、1分钟后第三次);
- 实现:调用失败后,向延时队列发送带重试时间的消息,到期后重新执行调用逻辑。
3. 定时通知/提醒
- 场景:用户预约会议(如明天10 点)、课程提醒(开课前15分钟)、账单到期提醒(到期前3天);
- 实现:将通知消息按提醒时间送入延时队列,到期后推送短信/APP通知。
4. 缓存过期清理
- 场景:自定义缓存(非Redis)需在指定时间后自动清理,释放内存;
- 实现:缓存写入时,向延时队列发送“缓存过期清理”消息,到期后执行删除逻辑。
5. 分布式定时任务
- 场景:替代单机定时任务(如crontab),实现分布式环境下的精准定时任务(如每天凌晨1点统计昨日数据);
- 实现:将定时任务按执行时间送入延时队列,分布式消费节点到期后执行任务。
三、为什么需要延时队列?
手动实现“延时任务”(如轮询数据库)存在诸多问题,延时队列从根本上解决了这些痛点:
