- 设计模式
发布订阅模式和生产消费模式
- 路由机制
1 NameServer存储broker注册的topic数据
2 productor和cosumer从NameServer中获取topic数据,从而得知将消息发到哪个broker上
3 nameserver和broke互相发送心跳包,注册topic数据和剔除不可用broker
- 高可用机制
1 producer发消息给broker,如果消息发送失败会采取两个措施:(1)一定时间内不发给该broker(消息发送失败的broker) (2)消息发送重试(默认两次)
2 broker和nameserver都可集群部署,每个broker都可以一主多从部署
- 消息存储
1 commitLog:所有topic消息存储在commitlog中,commitlog一个文件1G(可动态配置),文件名长度20位,名称为物理偏移量,前面位数不够用0补齐,这样可以通过物理偏移量快速找到消息在哪个文件。
2 consumerLog:commitLog落盘后,会异步存储消息的起始物理偏移量 + 消息大小 + 消息tag的hashcode到consumerLog。(tag设计:在消息拉取层面对消息进行隔离,而不是拉取完成后在系统中进行消息隔离)
3 所以消息的查找过程是:先从consumerLog中读取消息索引数据,再通过索引数据去commitlog拿topic消息。
4 mmap:rocketMQ通过mmap技术(用户空间的虚拟内存映射到磁盘存储地址)将消息换成到os cache中,后续os线程将cache的数据异步写到磁盘
5 indexFile:messageKey进行hash然后slot总数取模得到slot位置,每个slot都是4位整形,存储index的数据量。hash必然产生冲突,操作和hashmap一样,采用链表的方式。