元数据管理与优化
topic对应多个逻辑分区(Partition),称为队列(MessageQueue)
其中ConsumeOffset用于管理订阅组消费进度(如Map<String/* topicName@groupId */, Map<Integer /QueueId/, Long /Offset/>>)
RocketMQ采用定时任务对上面Map做checkPoint检查(检查周期5秒 - 所以当服务端主备切换或者正常发布时,都会有秒级的消息重复)
消息数据管理
存储核心是极致优化顺序写盘(append only将新消息追加文件末尾)。实现如下
- RocketMQ通过MappedByteBuffer实现 mmap 映射虚拟地址关联减少 数据区在缓存区来回拷贝
1.1 限制:mmap 文件不能太大(RocketMQ 1G,通过链表串联成逻辑队列 MappedFileQueue)
单挑消息存储格式
RocketMQ采用复杂存储编码将对象序列化,并写入文件(存储格式包括索引队列编号、位置)
- 单消息一般占用大小 = 消息元数据(91B+部分属性) + 消息payload(>2