最近一个粉丝朋友在面试时被面试官一个问题问懵了,看你简历上写着你深入研读过RocketMQ的源码,那请问一下:RocketMQ一个消费组内订阅同一个主题不同的TAG为什么会丢消息。 RocketMQ支持tag级别的消息过滤机制,其具体实现原理主要从存储、拉取模型两个部分进行展开。 MQ底层数据结构设计之巧妙 RocketMQ专门按照Topic为每一个topic建立索引,方便消费端按照topic进行消费,其具体实现为消息队列。 在RocketMQ中,ConsumeQueue的引入并不是为了提高消息写入的性能,而是为消费服务的。 消息消费队列中的每一个条目是一个定长的,设计极具技巧性,其每个条目使用固定长度(8字节commitlog物理偏移量、4字节消息长度、8字节tag hashcode),这里不是存储tag的原始字符串,而是存储hashcode。 目的就是确保每个条目的长度固定,可以使用访问类似数组下标的方式来快速定位条目,极大的提高了ConsumeQueue文件的读取性能,这样根据消费进度去访问消息的方法为使用逻辑偏移量logicOffset * 20即可找到该条目的起始偏移量.... RocketMQ一个消费组内订阅同一个主题不同的TAG为什么会丢消息 java