nameserver移除broker

129 阅读1分钟

nameserver移除broker

在nameserver启动的时候会初始化一个定时任务

public boolean initialize() {
    loadConfig();
    initiateNetworkComponents();
    initiateThreadExecutors();
    registerProcessor();
    // 这里开始一些定时任务
    startScheduleService();
    initiateSslContext();
    initiateRpcHooks();
    return true;
}
private void startScheduleService() {
   //这个方法就是用来 每5s定时去移除不活跃的broker的
   this.scanExecutorService.scheduleAtFixedRate(NamesrvController.this.routeInfoManager::scanNotActiveBroker,
        5, this.namesrvConfig.getScanNotActiveBrokerInterval(), TimeUnit.MILLISECONDS);

    this.scheduledExecutorService.scheduleAtFixedRate(NamesrvController.this.kvConfigManager::printAllPeriodically,
        1, 10, TimeUnit.MINUTES);

    this.scheduledExecutorService.scheduleAtFixedRate(() -> {
        try {
            NamesrvController.this.printWaterMark();
        } catch (Throwable e) {
            LOGGER.error("printWaterMark error.", e);
        }
    }, 10, 1, TimeUnit.SECONDS);
}

逻辑也很简单,遍历brokerLivelnfo路由表(HashMap),检测BrokerLiv巳Info的lastUpdateTimestamp上次收到心跳包的时间如果超过当前时间l20s,NameServer则认为该Broker已不可用,故需要将它移除,关闭Channel,然后删除与该Broker相关的路由信息

public void scanNotActiveBroker() {
    try {
        log.info("start scanNotActiveBroker");
        for (Entry<BrokerAddrInfo, BrokerLiveInfo> next : this.brokerLiveTable.entrySet()) {
            long last = next.getValue().getLastUpdateTimestamp();
            long timeoutMillis = next.getValue().getHeartbeatTimeoutMillis();
            if ((last + timeoutMillis) < System.currentTimeMillis()) {
                RemotingUtil.closeChannel(next.getValue().getChannel());
                log.warn("The broker channel expired, {} {}ms", next.getKey(), timeoutMillis);
                this.onChannelDestroy(next.getKey());
            }
        }
    } catch (Exception e) {
        log.error("scanNotActiveBroker exception", e);
    }
}
public void onChannelDestroy(BrokerAddrInfo brokerAddrInfo) {
    UnRegisterBrokerRequestHeader unRegisterRequest = new UnRegisterBrokerRequestHeader();
    boolean needUnRegister = false;
    if (brokerAddrInfo != null) {
        try {
            try {
                this.lock.readLock().lockInterruptibly();
                needUnRegister = setupUnRegisterRequest(unRegisterRequest, brokerAddrInfo);
            } finally {
                this.lock.readLock().unlock();
            }
        } catch (Exception e) {
            log.error("onChannelDestroy Exception", e);
        }
    }

    if (needUnRegister) {
    // 通过丢到一个队列里面去慢慢的处理这些请求。而不是直接同步去处理
        boolean result = this.submitUnRegisterBrokerRequest(unRegisterRequest);
        log.info("the broker's channel destroyed, submit the unregister request at once, " +
            "broker info: {}, submit result: {}", unRegisterRequest, result);
    }
}