RocketMQ系列5——4.X版本延迟消息

本文介绍了RocketMQ的延迟消息功能,包括延迟消息的介绍、举例和实现原理。延迟消息允许消息在达到预设延迟时间后才被消费,适用于订单超时、定时任务等场景。RocketMQ默认提供18个延迟等级,消息首先存储在SCHEDULE_TOPIC_XXXX主题的队列中,然后根据延迟级别在合适时间转发到目标队列供消费者消费。内部实现涉及CommitLog和CosumeQueue的交互,以及ScheduleMessageService的定时任务处理。
摘要由CSDN通过智能技术生成

        延迟消息是在业务场景中比较常用的功能,可以作为延迟队列。比如订单n分钟未支付自动取消,活动倒计时,定时发消息都可以使用到延迟消息。

一、延迟消息介绍

        生产者将消息发送到Broker,消费端不会立即消费,需要到达指定延迟时间才能被消费端消费。RocketMQ的延迟消息,默认支持设置18个延迟等级,每一个等级对应一个延迟时间。在Broker中会创建一个默认的SCHEDULE_TOPIC_XXXX的topic,topic下有18个队列,对应18个延迟等级。消息发送过来,会先把消息存储在topic名字为SCHEDULE_TOPIC_XXXX的队列内,等着延迟时间到了,在转发到目标队列,之后消费者在消费。

        由于broker是集群模式部署,每个节点都有18个队列。默认的延迟级别不满足业务需求也可以通过Message.setDelayTimeLevel( )方法进行设置,如下代码所示。

//默认
private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";
//修改成20h
private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 20h";
//新增20h,等级就变成了19
private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 20h";

二、延迟消息举例

生产者发送消息时,设置Message的DelayTimeLevel字段,设置消息的延迟等级。比如设置DelayTimeLevel=4 延迟等级,则对应的延迟为30s。消费者30s之后可以消费到该消息。

Message msg = new Message(topic, tag, body);
//设置延迟level为4 对应30s。传输对应等级,不传输具体时间限制。
//level设置为0表示不延迟
msg.setDelayTimeLevel(level);

三、延时消息实现原理

RocketMQ延迟消息在Broker内部流程图:

 步骤说明:

1.Broker接收到写入的消息,先将目标Topic和队列信息存储到消息的属性(Message对象内的

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值