RocketMQ学习(二)——重要参数和主从消息同步

生产者核心参数

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开始传输的物理位置。

发布了44 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hxyascx/article/details/102613152