本文主要分析Broker模块在RocketMQ担当的角色是什么,集群最核心模块Broker,主要负责Topic消息存储、消费者的消费偏移量管理(消费进度)
1、高并发读写服务
- 消息顺序写:所有Topic数据同时只会写入一个commitLog文件(默认1G),当一个文件写满后,写到一个新的commitLong文件,使得发消息TPS大幅度提高
- 消息随机读:RocketMQ尽可能让读命中系统的pagecache,因为操作系统访问pagecache时,即使只访问1k的数据,系统也会提前预读更多的数据(可用内存),在下次读时就可能命中pagecache,减少IO操作
2、负载均衡&动态伸缩
负载均衡:Broker上存Topic信息,Topic由多个队列组成,队列会平均分散在多个Broker上,而Producer的发送机制保证消息尽量平均分布到所有队列中,最终效果就是所有消息都平均落在每个Broker上
动态伸缩能力(非顺序消息):Broker的伸缩性体现在两个维度:Topic, Broker
- Topic纬度:假如一个Topic的消息量特别大,但集群水位压力还是很低,就可以扩大该Topic的队列数,Topic的队列数跟发送、消费速度成正比
- Broker纬度:如果集群水位很高了,需要扩容,直接加机器部署Broker就可以;Broker起来后向Name Server注册,Producer、Consumer通过Name Server发现新Broker,立即跟该Broker直连,收发消息
3、高可用&高可靠
高可用:集群部署时一般都为主备,备机实时从主机同步消息,如果其中一个主机宕机,备机提供消费服务,但不提供写服务
高可靠:所有发往Broker的消息,有同步刷盘和异步刷盘机制;同步刷盘时,消息写入物理文件才会返回成功;异步刷盘时,只有机器宕机,才会产生消息丢失,Broker挂掉可能会发生,但是机器宕机崩溃是很少发生的,除非突然断电
4、Broker&Name Server的心跳机制
单个Broker跟所有Name Server保持心跳请求,心跳间隔为30秒,心跳请求中包括当前Broker所有的Topic信息。Name Server会反查Broker的心跳信息,如果某个Broker在2分钟之内都没有心跳,则认为该Broker下线,调整Topic跟Broker的对应关系。但此时Name Server不会主动通知Producer、Consumer有Broker宕机
5、配置文件属性
#BrokerConfig
#nameServer地址,分号分隔
namesrvAddr=rocketmq1:9876;rocketmq2:9876
#broker名字,注意集群情况下不同的配置文件填写的不一样
brokerName=broker-a
#集群名称
brokerClusterName=rocketmq-cluster
#0表示Master,>0表示Slave
brokerId=0
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#MessageStoreConfig
#存储路径
storePathRootDir=/opt/rocketmq/store
#commitLog存储路径
storePathCommitLog=/opt/rocketmq/store/commitlog
#是否开启文件预热
warmMapedFileEnable=false
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#检测物理文件磁盘空间百分比
diskMaxUsedSpaceRatio=75
#文件保留时间,默认 72 小时
fileReservedTime=72
#限制的消息大小 默认4M
maxMessageSize=4194304
#刷新commitLog时要刷新多少页
flushCommitLogLeastPages=4
#将数据提交到文件时需要多少页
commitCommitLogLeastPages=4
#刷新到ConsumeQueue时需要多少页
flushConsumeQueueLeastPages=2
#彻底刷新到commitLog的时间间隔
flushCommitLogThoroughInterval=10000
#彻底提交到commitLog的时间间隔
commitCommitLogThoroughInterval=200
#彻底刷新到ConsumeQueue的时间间隔
flushConsumeQueueThoroughInterval=60000
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,一条20byte,根据业务情况调整
mapedFileSizeConsumeQueue=600000
#销毁文件的时间间隔
destroyMapedFileIntervalForcibly=120000
#
redeleteHangedFileInterval=120000
#Broker角色
#ASYNC_MASTER - 异步复制master
#SYNC_MASTER - 同步双写master
#SLAVE - 从
brokerRole=ASYNC_MASTER
#刷盘方式
#ASYNC_FLUSH - 异步刷盘
#SYNC_FLUSH - 同步刷盘
flushDiskType=ASYNC_FLUSH
#NettyServerConfig
#Broker对外服务监听端口
listenPort=10911
6、Broker启动时序图