RocketMQ
2021-05-31 16:52:20 0 举报
原理图
作者其他创作
大纲/内容
选择MessageQueue
启动
发送消息
NettyClient
Reactor线程池
IndexFile
RequestBody
NettyRemotingServer网络服务组件
写入
线程
物理位置
消息
RebalancerImpl重平衡组件
核心配置组件
BrokerStartUp
ConsumeQueue
Topic路由数据
NettyServerConfig网络配置信息
CommitLog磁盘
CommitLog
PullAPI拉取消息组件
消息响应
NamesrvController管控组件
RequestHeader
BrokerController管控组件
通过使用Dledger技术来实现数据同步,Dledger会替换CommitLog,然后接管CommitLog,Dledger收到一条消息后,会标记状态为uncommited,并发给slave的DledgerServer,slave收到后必须回一个ack,然后master会标记成commited,并要其他slave也标记为commited,这就是基于Raft协议二阶段完成的数据同步。2基于Raft协议实现选举机制
Consumer拉取消息消费的时候可能Master消费,也可能从Slave消费。正常情况下从Master消费,直接取pageCache中的消息,但是内存是有限的,在pageCache收到的消息达到内存最大容量时会将旧的数据刷入磁盘。如果消费的速度跟不上生产的速度,那么可能存在还没来得及消费的数据已经刷入磁盘了。这个时候去取数据则是从磁盘取,master就会要消费者下一次去slave读数据。
Response响应数据
获取Broker信息
SendMessage线程池
Work线程池
1ms/次,获取要转发的消息
NamesrvConfig配置信息
Reactor主线程
IndexDispatcher
Producer
转交请求,业务处理
初始化
NameServer
建立连接
监听请求
MasterBroker
同步刷盘
SocketChannel
异步刷盘
拉取路由数据
注册
PageCache
30S/心跳
Consumer
内存预映射+文件预热
使用
ConsumeQueueDispatcher
SlaveBroker
IO线程
ReputMessageService后台线程
端口
监听
拉取消息进行消费
清理磁盘CommitLog
OffsetStore消息进度组件
BrokerOutAPI对外通信组件
Netty客户端程序
转发
磁盘顺序写入消息
Request请求数据
转交请求,进行加密验证,编码解码等预处理
Channel
后台线程
选举晋升为master
同步消息
通过使用mmap技术实现内存映射,减少传统IO拷贝数据的次数,提高读写性能。因为mmap技术限制了映射文件最大一般为1.5G-2G。所以RocketMQ才让单个CommitLog文件为1G,ConsumeQueue文件为5.72M,不会太大。这样限制了RocketMQ底层文件的大小,就可以很方便的进行内存映射了。代码层面在java的NIO包下的MappedByteBuffer中的map函数,就是来实现内存映射的。RocketMQ做了两个优化点:1.内存预映射,它会将接下来需要读写的CommitLog,ConsumeQueue文件提前分配好MappedFile,也就是通过MappedByteBuffer的map函数进行内存映射,方便后面直接使用。2.文件预读,在执行完内存映射后会进行madvise系统调用,尽可能多的将文件数据加载到PageCache里面来。后面对CommitLog和ConsumeQueue的读写才能尽可能的从内存里面操作。
ServerBootstrap网络服务器
后台定时任务线程池
0 条评论
下一页