RocketMQ 5.0之前的版本不支持准确的延迟消息,只能通过实现定时消息的方式进行近似的延迟,然而这种延迟方式无法进行任意精度的控制,准确度受到多种因素的影响,通常可能有几十秒的误差。
在RocketMQ 5.0及以上版本中,RocketMQ支持准确的延迟消息。可以通过发送一个普通的消息,并设置这个消息的“延迟级别”(delay level),来指定这个消息需要被延迟的时间,最大支持的延迟时间可达29天,精度可达毫秒级别,精度和延迟时间是可配的。
比如可以以RocketMQ Java SDK为例,创建一个消息对象,然后在消息属性中添加一个延迟级别,例如:
Message message = new Message(
"TopicTest", // topic
"DelayTag", // tag
"Hello RocketMQ delay message".getBytes() // message body
);
// 设置 messageDelayTimeLevel 属性,此处表示10s的延迟
message.putUserProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "3");
延迟级别的值由具体业务需求进行配置和定义,它们通常以2的幂次方递增,比如:
延迟级别 | 延迟时间(秒) |
---|---|
0 | 0 |
1 | 1 |
2 | 5 |
3 | 10 |
4 | 30 |
... | ... |
RocketMQ 5.X 定时消息引入了秒级的时间轮算法。注意,是秒级时间轮。
从源码来看,RocketMQ 5.X 定义了一个 7 天的以秒为单位的时间轮,注意刻度为1s,没有再细,比如 10ms、100ms之类的 。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/