RocketMQ源码解析3-Borker
1.官方存储架构图
RocketMQ存储文件主要包括:CommitLog文件、ConsumerQueue文件、Index文件?
- CommitLog:存储文件,存储消费者发来的topic消息,一旦写入不支持修改
- ConsumeQueue:消息消费队列文件,消费者通过ConsumeQueue获取对应的topic消息
- IndexFile(index):消息索引文件,通过建立索引ID,调高消息读取速度
1.1 文件存储位置:
在broker启动时,可以看到启动类中BrokerStartup#createBrokerController()方法会执行实例化?new MessageStoreConfig()消息储存的默认配置。
2.架构原理
2.1CommitLog(存储日志):
????????消息主体以及元数据的存储主体,存储Producer写入的消息主体内容,单个文件大小默认1G=1073741824=1024*1024*1024
当第一个文件(文件名:00000000000000000000)满了,
写入第二个文件(文件名:00000000001073741824),
第三个文件名会继续追加1G(文件名:00000000002147483648)。消息主要是顺序写入依次追加到CommitLog中,一旦写入不支持修改????????
CommitLog按照上述命名的好处是给出任意一个消息的物理偏移量,可以通过二分法进行查找,快速定位这个文件的位置
2.2 ConsumeQueue(消费队列):
用于消费者消费时从CommitLog来查找待消费的消息,即消费者进行拉取Broker消息时,先从ConsumerQueue获取到待消费消息在CommitLog上的offset,根据offset从CommitLog中获取完整的消息。ConsumeQueue作用相当于CommitLog的索引文件。在集群模式下消费者组中可以存在多个实例,消费者实例都可以获取同一个ConsumerQueue的数据。所以说ConsumerQueue对应一个Topic对应多个消费者
ConsumeQueue的组成:
它不会直接存储CommitLog中的完整数据,只存储【起始物理位置偏移量,消息的内容大小,消息Tag的哈希值】总共20B,如下图所示:
每个ConsumeQueue都有自己的queueId,如果TopicConfig配置的队列数量是3个ConsumeQueue,那么这三个ConsumeQueue的queueId名为0、1、2。
默认存储路径是:$HOME/store/consumequeue/{topic}/{queueId}/{fileName}
2.3 IndexFile(文件索引):
IndexFile(索引文件):由IndexHeader(索引文件头), Slot(槽位)和Index(消息的索引内容)三部分构成。对于每个IndexFile来说IndexHeader是固定大小的,Slot是索引的目录,用于定位Index在IndexFile中存储的物理位置。存储图:
- index索引:主要存储消息key与offset的对应数据,可以通过key或时间区间来查询消息的方法,Index的底层存储设计为在文件系统中实现HashMap结构,故rocketmq的索引文件其底层实现为hash索引?
由于文章有点长,后续以小章节分开记录
3.消息处理流程图
之前的官方流程架构图看着比较复杂,我在网上找了一张比较简单的消息处理流程图,便于理解
- ?消息接收:是指SendMessageProcessor类会接收producer发送到borker的消息,将消息写入到commigLog文件;
- 消息分发:ReputMessageService类会启动一个线程,不断地将commitLong分到到对应的consumerQueue,这一步操作会写两个文件:consumerQueue与indexFile;
- 消息投递:是指将PullMessageProcessor消息发往consumer的流程,consumer会发起获取消息的请求,broker收到请求后,调用PullMessageProcessor类处理,通过consumerQueue文件获取消息,返回给consumer。
4.broker启动流程
5.broker消息接收流程(写入commitLog)
RocketMQ源码解析-broker消息接收流程(写入commitLog)
6.RocketMQ源码解析6- borker(处理消费者拉取消息)
RocketMQ源码解析6- borker(处理消费者拉取消息)
7.RocketMQ源码解析7-Borker(刷盘机制)?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!