Alibaba Spring Cloud 二十一 RocketMQ 延迟消息

在许多业务场景中,消息不仅需要立即被消费,有时还希望能“延迟”一段时间再被处理,例如:

  • 订单未支付自动取消:在用户下单后,如果 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"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值