接着上一篇 RocketMQv4.9.1源码分析-HA主从 Master读写处理 解答了Master相关的问题,这篇文章围绕Slave相关的一些问题继续看代码。
对于slave,我们有如下一些疑惑:
slave
如何获取master
的路由信息slave
如何向master
报告offset
的slave
如何处理master
同步的数据
在整体的类图布局中,slave相关的代码都在HAClient类中
HAClient
HAClient部分是Slave处理的核心,其中包括三部分:
- slave与master建立连接
- slave向master汇报同步进度
- slave接收master的同步数据并处理
HAClient 启动
之前提到了,HAClient启动的触发时机是HAService启动的方法中,在store/src/main/java/org/apache/rocketmq/store/ha/HAService.start()
中。
// HAService 启动
public void start() throws Exception {
this.acceptSocketService.beginAccept();
this.acceptSocketService.start();
this.groupTransferService.start();
this.haClient.start();
}
复制代码
HAClient的启动代码在store/src/main/java/org/apache/rocketmq/store/ha/HAService$HAClient.run()
路径下。
其中3个核心的步骤在代码注释中有进行标记
@Override
public void run() {
log.info(this.getServiceName() + " service started");
while (!this.isStopped()) {
try {
// 步骤一:连接到master
if (this.connectMaster()) {
// 步骤二:如果距离上次报告的时间间隔到了最大等待时间,立刻执行一次报告
if (this.isTimeToReportOffset()) {
// 报告slave offset
boolean result = this.reportSlaveMaxOffset(this.currentReportedOffset);
if