全站最硬核 百万字强肝RocketMq源码 火热更新中~(九十四)延时队列

注意各种mq,对于延时消息的实现思路都是基本一样的:

Broker端内置延迟消息处理能力,将延迟消息通过一个临时存储进行暂存,到期后才投递到目标Topic中。如下图所示:请添加图片描述

步骤说明如下:

  1. producer要将一个延迟消息发送到某个Topic中
  2. Broker判断这是一个延迟消息后,将其通过临时存储进行暂存。
  3. Broker内部通过一个延迟服务(delay service)检查消息是否到期,将到期的消息投递到目标Topic中。这个的延迟服务名字为delay service,不同消息中间件的延迟服务模块名称可能不同。
  4. 消费者消费目标topic中的延迟投递的消息

**显然,临时存储模块和延迟服务模块,是延迟消息实现的关键。**上图中,临时存储和延迟服务都是在Broker内部实现,对业务透明。

如下图为:RocketMQ延时消息内部流转图请添加图片描述
可以看到RocketMQ对于延时消息的实现思路是这样的:

消息进来首先存入commitLog,识别为延时消息后,送入延时消息特有的Topic中(相当于是会对原本的消息topic做一个修改,前缀是SCHEDULE_TOPIC_XXX),之后送入延时服务,在延时服务中做延时(定时器Timer),延迟时间到后,进入commitLog(commitLog是存储消息实体的地方,而ConsumeQueue是存储消息偏移的地方),在进入目标Topic的ConsumeQueue中(这里的目标Topic指的就是原本的那个Topic,在没有修改前的),然后进入consumer消费。

先掌握大体思路,接下来我们从源码角度看下:

第一步:修改消息Topic名称和队列信息

RocketMQ Broker端在存储生产者写入的消息时,首先都会将其写入到CommitLog中。之后根据消息中的Topic信息和队列信息,将其转发到目标Topic的指定队列(ConsumeQueue)中。

由于消息一旦存储到ConsumeQueue中,消费者就能消费到,而延迟消息不能被立即消费,所以这里将Topic的名称修改为SCHEDULE_TOPIC_XXXX,并根据延迟级别确定要投递到哪个队列下。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值