一、NameServer的架构设计
Broker启动的时候会向所有的NameServer注册,生产者在发送消息时会先从NameServer中获取Broker消息服务器的地址列表,根据负载均衡算法选取一台Broker消息服务器发送消息。NameServer与每台Broker之间保持着长连接,并且每隔10秒会检查Broker是否存活,如果检测到Broker超过120秒未发送心跳,则从路由注册表中将该Broker移除。
但是路由的变化不会马上通知消息生产者,这是为了降低NameServe的复杂性,所以在RocketMQ中需要消息的发送端提供容错机制来保证消息发送的高可用性,这在后续关于RocketMQ消息发送的章节会介绍。
二、从源码来看NameServer的启动流程
2.1 源码获取
Github上的仓库地址:github.com/apache/rock…如果访问速度较慢的去Gitee上获取源码,这里也把Gitee的地址贴上:https://gitee.com/apache/rocketmq
这里我使用的RocketMQ版本是4.9.4。
2.2 Window上使用IDEA运行RocketMQ
因为是在学习阶段,所以把RokcetMQ的代码拉到本地,这里我使用IDEA运行调试代码,在学习的时候也可以加上自己的注释。
1、把RocketMQ的代码拉到本地之后,切换分支到自己想要用的分支即可,这里我是切换到release-4.9.4
2、使用IDEA打开rocketmq
,等IDEA构建完成之后,目录如下。
3、图里的ROCKETMQ文件夹是我创建,主要有conf文件夹,并且将distribution
目录下的conf目录下的内容复制过来。
修改broker.conf的内容:其中一些路径自行修改
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
namesrvAddr=127.0.0.1:9876
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 存储路径E:\java\source\rocketmq\ROCKETMQ
storePathRootDir=E:\\java\\source\\rocketmq\\ROCKETMQ\\store
# CommitLog存储路径
storePathCommitLog=E:\\java\\source\\rocketmq\\ROCKETMQ\\store\\commitlog
# 消费队列存储路径
storePathConsumeQueue=E:\\java\\source\\rocketmq\\ROCKETMQ\\store\\consumequeue
# 消息索引存储路径
storePathIndex=E:\\java\\source\\rocketmq\\ROCKETMQ\\store\\index
# checkpoint文件存储路径
storeCheckpoint=E:\\java\\source\\rocketmq\\ROCKETMQ\\store\\checkpoint
# abort文件存储路径
abortFile=E:\\java\\source\\rocketmq\\ROCKETMQ\\store\\abort
复制代码
还有三个logback日志文件配置:logback_broker.xml、logback_namesrv.xml、logback_tools.xml。这里我主要的修改是将${USER_HOME}
改成${ROCKETMQ_HOME}
。在Window下这些日志会被存放到C盘,这里我通过在启动Broker和NameServer时指定一个环境变量:ROCKETMQ_HOME
,也就是我创建的ROCKETMQ文件夹,主要是学习调试的时候方便查看日志。
<appender name="DefaultAppender"