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 筛选的数据基础,详情见 原理 | 消息存储

posted @ 2025-06-27 17:20  问仙长何方蓬莱  阅读(13)  评论(0)    收藏  举报