生产者把消息发送到消息队列中以后,并不期望被立即消费,而是等待指定时间后才可以被消费者消费,这类消息通常被称为延迟消息。
在RocketMQ中,支持延迟消息,但是不支持任意时间精度的延迟消息,只支持特定级别的延迟消息。如果要支持任意时间精度,不能避免在Broker层面做消息排序,再涉及到持久化的考量,那么消息排序就不可避免产生巨大的性能开销。
消息延迟级别如下:
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
共18个级别。在发送消息时,设置消息延迟级别即可,设置消息延迟级别时有以下3种情况:
1、设置消息延迟级别等于0时,则该消息为非延迟消息。
2、设置消息延迟级别大于等于1并且小于等于18时,消息延迟特定时间。
3、设置消息延迟级别大于18时,则该消息延迟级别为18h。
配置
为了使延迟消息生效,还需要添加队列的异步配置如下:
spring:
cloud:
stream:
rocketmq:
binder:
# rocketmq 服务器地址
name-server: 192.168.0.180:9876
bindings:
# 队列延迟开启
test-mq-output:
producer:
sync: true
bindings:
# 绑定队列
test-mq-output:
destination: test-mq-topic
group: test-mq-group
mcc-sms-passage-input:
destination: test-mq-topic
group: test-mq-group
consumer:
#多线程
concurrency: 20
#重试1次
maxAttempts: 2
配置好以后,在发送消息至MQ时设置延迟级别就可以了。
Message msg=new Message();
msg.setTopic("TopicA");
msg.setTags("Tag");
msg.setBody("this is a delay message".getBytes());
//设置延迟level为5,对应延迟1分钟
msg.setDelayTimeLevel(5);
producer.send(msg);
MQ的流程图如下