RocketMq | 概念 - [TOPIC 相关]
主题:Topic
rocketMq 逻辑上存储消息的顶层容器,常用于标记消息归属于同一类业务
在 rocketMq 中,topic 是一个逻辑概念,详见 原理 | 消息存储
消息队列:MessageQueue
rocketMq 逻辑上存储消息的实际容器,位于 topic 之下,一个 topic 下至少有 1 个消息队列
队列可以直接视为一个巨大的流,因此具有
- 有序性:队列中的消息天然有序
- 流式操作:可以从任意点位读取,进而继续聚合、回溯等
消息 ID:MessageId/offsetMsgId
MessageId 是在 broker 端自动生成的消息 id,类似数据库的 id,并不能严格的保证唯一
MessageId 根据使用 IPv4 / IPv6,长度可能为 16/28 Byte,经过编码后表现为长度 32/56 字符串
MessageId 中包含 broker 信息与消息偏移量信息,具体如下
结构
| 部分 | 长度 | 说明 |
|---|---|---|
| broker_ip | 4/16 | 分别 IPv4I/Pv6 |
| broker_port | 4 | 端口 |
| commitlog_offset | 8 | commitlog 的偏移量 |
编码
以一个 MessageId 为例:C0A8038000002A9F00000000000005C9
此值实际是 0xC0A8038000002A9F00000000000005C9 经过编码为字符串得到的
11000000 10101000 00000011 10000000 //192.168.3.128
00000000 00000000 00101010 10011111 //10911
00000000 00000000 00000000 00000000 //
00000000 00000000 00000101 11001001 //从 1481 字节开始
消息唯一 ID:UNIQ_KEY/uniqMsgId
MessageId 是在 client 端自动生成的消息 id,类似数据库的 id,从命名即可见是全局唯一的
MessageId 根据使用 IPv4 / IPv6,长度可能为 16/28 Byte,经过编码后表现为长度 32/56 字符串
UNIQ_KEY 的生成思路基本复刻雪花算法,具体如下
| 部位 | 子项 | 大小 | 说明 |
|---|---|---|---|
| FIX_STRING | ip | 4/16 | IP,随 IPv4/IPv6 长度不同 |
| port | 2 | 端口 | |
| hash | 4 | classloader hash,用和这个值作为类似 clientId 的东西 | |
| TIME_DIFF | diff | 4 | 生成 id 时的时间偏差,当前时间 - 开始时间 开始时间 = MessageClientIDSetter 的初始化时间,基本可以理解为jvm 启动时间 |
| COUNTER | COUNTER | 2 | 计数 |
消息标签:MessageTag
发送消息时可以指定 tag,构建消息时,会以 TAGS 为 key 存入的消息的 properties
{
"topic":"xx"
"properties":{
"TAGS":tag
}
}
tag 会以 hash 的形式存在于 consumequeue,并以此作为 tag 过滤的基础,详情见 原理 | 消息存储
消息索引:MessageKey
发送消息时可以指定 key,构建消息时,会以 KEYS 为 key 存入的消息的 properties
{
"topic":"xx"
"properties":{
"KEYS": messageKey
}
}
key 会以 hash 的形式存在于 index,并以 Message Key 筛选的数据基础,详情见 原理 | 消息存储

浙公网安备 33010602011771号