生产者核心参数
producerGroup: 组名。一个应用(JVM)中组名不能重复。
defaultTopicQueueNums: 默认的topic对于Queue的数量,默认是4。
sendMsgTimeout: 生产者发送消息的超时时间。
compressMsgBodyOverHowmuch: 消息超过多大开始进行压缩,默认压缩字节4096。
retryTimesWhenSendFailed: 当消息发送失败时,重发次数。
retryAnotherBrokerWhenNotStoreOK: 当一个broker存储消息失败时,是否重发到其他broker。
maxMessageSize: 最大消息限制,默认128K。
主从同步机制解析
-
同步的信息
包含两部分:数据内容 + 元数据信息
-
数据内容
实时进行同步,同步的是commitlog中的数据,对实时性要求高,并且丢失数据就无法恢复。使用原生socket。
-
元数据信息
broker判断如果是slave节点,那么会启动定时任务不断同步,如果丢失也可以从其他地方重试获取。包含topic信息和offset等。使用netty同步。
元数据同步源码解析
首先由于是broker的数据同步,所以这部分代码是写在rocketmq-broker的模块中。是在handleSlaveSynchronize方法中通过定义了一个固定时间的定时任务,时间是1分钟执行一次,当然前提条件是broker节点的角色是slave,而broker节点是master时,如果有定时任务会取消,因为master是不用同步元数据信息。这个方法会有三个地方调用:1、broker刚刚启动 2、master切换成slave 3、slave切换成master。
handleSlaveSynchronize 源码
private void handleSlaveSynchronize(BrokerRole role) {
//判断broker角色 master或slave
if (role == BrokerRole.SLAVE) {
if (null != slaveSyncFuture) {
slaveSyncFuture.cancel(false);
}
this.slaveSynchronize.setMasterAddr(null);
//创建定时任务
slaveSyncFuture = this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
BrokerController.this.slaveSynchronize.syncAll();
}
catch (Throwable e) {
log.error("ScheduledTask SlaveSynchronize syncAll error.", e);
}
}
}, 1000 * 3, 1000 * 10, TimeUnit.MILLISECONDS);
} else {
//handle the slave synchronise
if (null != slaveSyncFuture) {
slaveSyncFuture.cancel(false);
}
this.slaveSynchronize.setMasterAddr(null);
}
}
定时任务的逻辑是写在syncAll方法中。主要是需要同步4部分内容:1、同步topic配置信息 2、同步消费者偏移量 3、同步延时偏移量 4、同步订阅组配置信息。4个方法的内容实际上就是封装了netty做rpc的调用,对不同的操作都会对应到一个code。
syncAll 源码
public void syncAll() {
//同步topic配置信息
this.syncTopicConfig();
//同步消费者偏移量
this.syncConsumerOffset();
//同步延时偏移量
this.syncDelayOffset();
//同步订阅组配置信息
this.syncSubscriptionGroupConfig();
}
数据内容同步
数据内容同步主要是在rocketmq-store中。主要涉及 HAConnection、HAService、WaitNotifyObject三个类。并没有使用netty而是原生nio,是为了更加高效。
- 对于Master节点
AcceptSocketService:接受slave节点连接。
HAConnection
ReadSocketService:读来自Slave节点的数据。
WriteSocketService:写往到Slave节点的数据。 - 对于Slave节点
HAService
HAClient:对Master节点连接、读写数据。
通信协议
Slave => Master:上报CommitLog已经同步到的物理位置。使用maxPhyOffset字段,代表CommitLog接受到的最大物理位置。
Master => Slave:传输新的CommitLog数据。使用fromPhyOffset字段,代表CommitLog开始传输的物理位置。