在许多业务场景中,消息不仅需要立即被消费,有时还希望能“延迟”一段时间再被处理,例如:
- 订单未支付自动取消:在用户下单后,如果 X 分钟内未支付,则需要自动关闭订单。
- 定时触发任务:需要在指定的未来时间点(或延迟若干秒、分钟等)执行某个动作。
- 消息重试:部分业务需要先等待一段时间再做二次处理。
RocketMQ 为此提供了 延迟消息(Scheduled/Delayed Message) 的功能,下面将介绍它的原理、用法、限制和常见问题。
1. 延迟消息的原理
RocketMQ 的延迟消息是基于 “延迟级别” (Delay Time Level) 来实现的。Broker 内部维护了一个特殊的“定时”Topic(SCHEDULE_TOPIC_XXXX),当 Producer 指定一个延迟级别时,消息并不会直接投递到目标 Topic,而是先保存到这个特殊的定时 Topic 里。Broker 内部会有一个定时任务线程轮询扫描这些延迟队列,待延迟时间到达后,再重新投递(重新写回)到原本的目标 Topic 供正常消费。
关键点:
-
RocketMQ 默认提供了 18 个延迟级别,从 1s、5s、10s、30s 到 2 小时不等,每个级别对应一个固定的延迟时间。
-
默认映射关系(可在
broker.conf或源码中通过messageDelayLevel修改)如下:Level 延迟时间 1 1s 2 5s 3 10s 4 30s 5 1m 6 2m 7 3m 8 4m 9 5m 10 6m 11 7m 12 8m 13 9m 14 10m 15 20m 16 30m 17 1h 18 2h
如果需要其他时间精度或更长的延迟,需要修改 Broker 端配置(或自行编译修改),默认情况下只能使用这 18 个档位。
2. 基本使用方法
2.1 生产者侧
在发送消息时,通过 Message#setDelayTimeLevel(int level) 来指定延迟级别。例如:
DefaultMQProducer producer = new DefaultMQProducer("delay_producer_group"

最低0.47元/天 解锁文章
1363

被折叠的 条评论
为什么被折叠?



