结论
RocketMQ的BrokerID必须要大于0,并且0表示Master节点、>0的任意数表示Slave节点。为什么呢?不会是if/else吧。
源码
1、Broker启动脚本:
nohup sh bin/mqbroker -n 100.10.100.100:9876 -c conf/broker.conf autoCreateTopicEnable=true &
在启动Broker的时候,即BrokerStartup#main()方法中会运行createBrokerController()方法创建BrokerController控制器,在这里面有如下逻辑:
通过上面new出来的MessageStoreConfig后取出brokerRule;如果角色为SYNC_MASTER,则设置BrokerID为0;所以只要我们在配置中配置了brokerRule=SYNC_MASTER,brokerId为0可以不写;不过brokerRule=ASYNC_MASTER时,brokerId为0要写;默认的broker.conf配置就是这样搞的。
如果brokerRule为SLAVE,是不允许brokerId小于0的,否者会启动Broker失败,并打印提示信息。
那么MessageStoreConfig中的brokerRule是怎么赋值的?
- 我们可以看到MessageStoreConfig中是没有自定义构造函数的,也没有lombda注解存在,所以不存在通过构造函数赋值。
- 再看brokerRole这个字段上面有个@ImportantFiled注解,brokerRule的赋值会不会和这个注解有关系?
2、@ImportantField注解的作用?
1、这个注解对程序的运行来说并没有什么实质性的作用;只是用来标识这个字段是一个重要的字段,用于Broker启动时 -p 和 -m 选项中分别打印重要的和不重要的字段内容。
@ImportantField的判定逻辑主要体现在MixAll类中,主要是在启动脚本填入 -p 或 -m 选项时判断是否只打印重要的字段,默认是的。
3、配置文件数据到内存的加载?
在启动Broker时,会通过-c 指定配置文件(broker.conf),在BrokerStartup类中的createBrokerController()方法通过CommandLine获取到配置文件的内容,然后利用反射注入到指定类的属性中。
比如broker.conf中默认配置了brokerRule:
那么在Broker启动的时候会将这个配置映射到MessageStoreConfig的brokerRule上。






还没有评论,来说两句吧...