RocketMQ订阅关系不一致
订阅关系不一致会有什么问题吗?
阿里二面: 同一个消费组内的消费实例,如果订阅了相同的 topic,但是订阅的 tag 不一样,会有什么问题吗?
测试配置消费实例1
生产配置消费实例2
阿里云--消息队列 RocketMQ 版
会导致订阅关系不一致,导致消息丢失。
RocketMQ 要求同一个消费者Group ID下所有Consumer实例所订阅的Topic、Tag必须完全一致。订阅的同一个Topic中的Tag必须一致,包括Tag的数量和Tag的顺序。
阿里云官方文档介绍——订阅关系一致
为什么订阅关系不一致会导致消息丢失呢?
为了提高消费效率,RocketMQ 引入了 ConsumeQueue,ConsumerQueue 中保存消息在 CommitLog 文件中的物理偏移量。ConsumerQueue 中的元素内容如下:
(1)前8个字节记录消息在 CommitLog 中的偏移量。
(2)中间4个字节记录消息消息大小。
(3)最后8个字节记录消息中tag的 hashcode。
这个tag的作用是过滤消息,假如一个 Consumer订阅了Topic1中的Tag1,那这个 Consumer拉取消息时,首先从Name Server获取订阅关系,得到当前Consumer订阅的所有tag的hashcode集合codeSet。每次从ConsumerQueue获取一条记录,就要判断最后8个字节 tag hashcode 是否在 codeSet 中,比如 Tag2 不在 codeSet 中,就会被过滤掉。