1. 概述
1.1 问题概述
消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。
而越来越多的公司采用 RocketMQ 做为自己系统的消息队列,但是目前开源的 RocketMQ 的延时消息只支持固定的延时消息,比如:
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
但实际业务会涉及到可能任意的时间延迟发送。
而这一切需要我们基于 RocketMQ 进行改造适应任意时间延时的需求。
RocketMQ 原来的延时消息如何实现
任意时间的延时消息如何实现
如何使用改造后的延时消息
基于 RocketMQ 的 Stream 的如何调用改造后的延时消息
1.2 名词解析
名词 | 解释 | 备注
-|-|-
topic | topic 为 rocketmq 业务消息分组 | Topic 包含多个队列 |
queue | topic 包含的队列 | - |
queueId|topic 包含的 queue 的 id|-|
broker | 消息存储中心,消息存储是 broker 的核心 | 所有的消息都保存在 broker 当中 |
offset| queue 是无限长的数组,一条消息进来下标就会长 1,下标就是 offset|-|
ConsumeQueue|一个消息的逻辑队列,存储了这个 Queue 在 CommitLog 中的起始 offset,log 大小和 MessageTag 的 hashCode|-|
wheel-timer-queue|高性能延时处理的任务队列|开源实现"wheel-timer-queue"|
环形队列|wheel-timer-queue 的别称,其内部实现保存延时消息的队列像一个环形队列|-|
移动针|环形队列里的一格,当设置 3600 大小的时候,一秒则移动一格|-|
slot|环形对列每一格对应的集合|-|
num|延时消息属于环形队列的某个集合,大于 3600,则 num=延时数值/3600,这样超过 3600 还是可以对应在某个集合中,只是 num>0|-|
RocketMQTask|是环形队列判断延时到期触发的一个 task 任务|-|