本文主要分析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启动时序图

rocketmq nameserver剔除broker节点 rocketmq topic broker_Server