RocketMQ5.0源码分析-AutoSwitchHAClient
在RocketMQ5.0的HA模式中,AutoSwitchHAClient
是一个重要的组件,主要作用Broker Slave中用来处理Broker Master发来的CommitLog数据。RocketMQ5.0对AutoSwitchHAClient
进行了增强来适应RocketMQ5.0的DLedger Controller的模式。
Tips: RocketMQ版本:5.0.0
1. RocketMQ4.x和RocketMQ5.0版本协议对比
在RocketMQ4.x版本中只有一个CommitLog数据传输的协议,而RocketMQ5.0为了适配DLedger Controller的模式增加了新的握手和连接协议以及对原有的CommitLog传输协议进行了增强。
- HANDSHAKE(新增协议)
- TRANSFER(对4.x版本进行了增强)
1.1 HANDSHAKE协议
Slave发送给Master协议格式:
作用:将Slave的状态告诉Master。
这个协议是RocketMQ5.0新增的协议。
Tips: 在Broker Slave给Broker Master发了HANDSHAKE后,Broker Master处理完成后会给Broker Slave回一个ACK
Master给Slave回复的ACK协议格式:
作用:用于对齐Slave和Master的数据
1.2 TRANSFER协议
RocketMQ4.x协议格式:
分为头部和数据两大部分,头部包含了offSet和数据大小
RocketMQ5.0协议格式:
由于是RocketMQ4.x的协议增强,除了包含offSet和数据大小以外还包含了DLedger Controller模式的一些Broker的元数据信息。
2. RocketMQ5.0 AutoSwitchHAClient处理流程
AutoSwitchHAClient
处理流程示意图如下:
Tips: 从源码可以知道AutoSwitchHAClient继承了ServiceThread,所以本质上AutoSwitchHAClient是一个线程。线程的循环执行来处理Master Broker发送过来的CommitLog。
AutoSwitchHAClient
主要通过不同的状态来控制不同的流程:
状态有以下几种:
- SHUTDOWN
- READY
- HANDSHAKE
- TRANSFER
- SUSPEND(暂时没用到)
AutoSwitchHAClient主要是Broker Slave用来处理Broker Master发送的数据,以及Broker Slave自身的一些内部
2.1 READY
READY
状态也是初始化状态,当AutoSwitchHAClient被初始化,AutoSwitchHAClient的状态会被设置为READY状态。在READY状态下主要做两件事:
- Truncate Invalid message(截断无效的message)
- Connect Broker Master(与Master建立TCP链接)
接下来我们就来分析这两种情况。