Board logo

标题: RocketMQ 生产者 Producer 启动过程(6) [打印本页]

作者: look_w    时间: 2019-4-12 13:50     标题: RocketMQ 生产者 Producer 启动过程(6)

startScheduledTask() 方法:定时任务

    private void startScheduledTask() {
        // 1.如果 NameServer 地址默认没配置,则定时向一个Http地址获取
        if (null == this.clientConfig.getNamesrvAddr()) {
            this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    try {
                        MQClientInstance.this.mQClientAPIImpl.fetchNameServerAddr();
                    } catch (Exception e) {
                        log.error("ScheduledTask fetchNameServerAddr exception", e);
                    }
                }
            }, 1000 * 10, 1000 * 60 * 2, TimeUnit.MILLISECONDS);
        }
     
        // 2. 定时的从 NameServer 中获取 Topic、broker、queue 相关信息
        this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    MQClientInstance.this.updateTopicRouteInfoFromNameServer();
                } catch (Exception e) {
                    log.error("ScheduledTask updateTopicRouteInfoFromNameServer exception", e);
                }
            }
        }, 10, this.clientConfig.getPollNameServerInterval(), TimeUnit.MILLISECONDS);
     
        // 3. 定时清理无效的Broker,并向所有的Broker 发送心跳数据
        this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    MQClientInstance.this.cleanOfflineBroker();
                    MQClientInstance.this.sendHeartbeatToAllBrokerWithLock();
                } catch (Exception e) {
                    log.error("ScheduledTask sendHeartbeatToAllBroker exception", e);
                }
            }
        }, 1000, this.clientConfig.getHeartbeatBrokerInterval(), TimeUnit.MILLISECONDS);
     
        // 4. 定时的持久化 Consumer 端消费每个 queue的 offset 数据。
        this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    MQClientInstance.this.persistAllConsumerOffset();
                } catch (Exception e) {
                    log.error("ScheduledTask persistAllConsumerOffset exception", e);
                }
            }
        }, 1000 * 10, this.clientConfig.getPersistConsumerOffsetInterval(), TimeUnit.MILLISECONDS);
     
        // 5. 调整消费端的线程数
        this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    MQClientInstance.this.adjustThreadPool();
                } catch (Exception e) {
                    log.error("ScheduledTask adjustThreadPool exception", e);
                }
            }
        }, 1, 1, TimeUnit.MINUTES);
    }

    1、定时更新 NameServer 地址
    每个2分钟,程序会向一个Http地址发送请求来获取NameServer地址来动态更新NameServer地址。

    2、 定时的从 NameServer 中获取 Topic、broker、queue 相关信息
    默认每隔 30秒去 NameServer 中获取Topic、broker、queue等相关信息。
    如果有新broker注册或下线,producer端会在30秒之内感知。

    3、定时清理无效的Broker,并向所有的Broker 发送心跳数据.
    默认每隔 30 秒向 Broker 发送心跳数据 和 用户自定义的 filterclass 类。

    4、定时的持久化 Consumer 端消费每个 queue的 offset 数据。
    默认每隔 5 秒持久或 Consumer 消费的 queue 的 offset信息。
    持久化分为,远程持久化和本地持久化。
    MessageModel.CLUSTERING 模式 queue的offset 保存到 broker上。
    BROADCASTING("BROADCASTING") 模式 queue 的 offset 保存在本地。

    5、调整消费端的线程数
    每隔 1 分钟计算每一个queue中消息挤压的数量,如果超过100000条,则增加消费线程的并发数,如果小于80000条则减少消费者的线程数。
    不过进入源码中看,调整消费者的线程数都注释掉了。





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0