RocketMQ源码系列 broker启动流程源码解析
Posted Dream_it_possible!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ源码系列 broker启动流程源码解析相关的知识,希望对你有一定的参考价值。
目录
rocketmq版本: 4.8.0
一、初识Broker
broker是rocketmq核心组件之一,在发送消息的时候和消费消息之间起到桥梁作用,其中topic和消息队列存放在broker里,服务消费者可以根据topic来消费服务生产者发送的消息。
每个topic创建时会由broker默认生成4个读队列和4个写队列,topic默认的权限为6,即读写权限,读写队列数量相同有助于扩容, 多个broker组成一个集群,brokerName由相同的多台broker组成一个Master-slave架构。
二、broker集群工作流程详解
broker主从架构部署
为了保证broker高可用,我们在正式环境中采用同步的master-slave架构形式来部署,同步的形式有利于保证更高的消息可靠性,不过在启动的时候默认为broker规则为ASYNC-MASTER。其中一个master可以对应多个slave,但是一个slave只能对应一个master, master和slave的brokerName是相同的。每个broker与NameSrv建立长连接,然后定时的将broker信息注册到nameSrv上。brokerId:0 的为master, brokerId: 1的为slave。
需要注意的是: 此版本的rocketmq只有slave=1的broker节点参与读负载。
在store模块中的MessageStoreConfig类中配置了broker默认启动规则为ASYNC_MASTER,刷盘机制也是异步的ASYNC_FLUSH。
broker 集群工作流程
1) NameSrv启动成功后,等待broker、Consumer和producer启动后也与NameSrv保持长连接, NameSrv相当于是路由控制中心。
2) 启动broker, broker与所有的NameSrv建立长连接, broker 通过定时线程定时向NameSrv发送心跳,broker信息注册到所有的NameSrv上, 包含brokerName、brokerAddr、clusterName等由nameSrv去保存。
3) producer启动时,先随机选择Namesrv集群中的某一台机器保持长连接,同时手动创建topic, 然后指定topic放入到哪些broker中,创建topic的过程可以自动, 因此在发送消息前,producer会先根据topic去找到哪些broker,然后拿到broker里的所有队列列表,轮询从队列列表中选择一个队列, 然后与队列所在的broker建立连接,向broker发送消息。
4) Consumer消费消息前,先随机选择Namesrv集群中的某一台机器保持长连接, 然后根据topic 去NameSrv中找到有哪些broker,然后consumer与broker建立连接,consumer就能消费到消息了。
三、broker启动流程分析
broker的启动流程可以参考NameServer的启动流程,也可以分解为三步骤: 加载broker相关配置、执行intialize()、启动各服务。
1. 加载broker相关配置
NettyServerConfig 是配置的处理消息发送者和消息消费者发送过来的请求。
NettyClientCongfig 是配置的是与NameSrv 保持连接的请求。
2. initialize()
initialize()方法里做了很多事,我画了一张图,如下概述了initialize()方法做了哪些事。
3. start()
上述的Initialize() 方法执行成功后,就会返回一个boolean,为true的时候返回controller,否则通过勾子函数关闭controller。
正式启动broker
以上是关于RocketMQ源码系列 broker启动流程源码解析的主要内容,如果未能解决你的问题,请参考以下文章
RocketMQ源码系列 NameServer 核心源码解析
RocketMQ源码系列 NameServer 核心源码解析
RocketMQ源码(15)—消费者DefaultMQPushConsumer启动主要流程源码