• Rocket MQ 2


    通过上文中使用可以看到,主要逻辑还是在NamesrvController中包含KVConfigManager负责配置相关的读写,RouteInfoManager负责路由信息的管理;

    启动定时任务定时打印配置信息,另一个定时任务去检测是broker是否超时,整个远程通信是利用NettyRemotingServer

    package org.apache.rocketmq.namesrv;
    ......
    /**
     * it-worker's comments: 主要包含了各种配置的读取,配置管理和路由管理,远程调度依赖remoteserver,通过两个定时任务打印配置项并且扫描Broker是否下线
     */
    public class NamesrvController {
        private static final Logger log = LoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
        private final NamesrvConfig namesrvConfig;
        private final NettyServerConfig nettyServerConfig;
        private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl(
            "NSScheduledThread"));
        private final KVConfigManager kvConfigManager;
        private final RouteInfoManager routeInfoManager;
        private RemotingServer remotingServer;
        private BrokerHousekeepingService brokerHousekeepingService;
        private ExecutorService remotingExecutor;
        private Configuration configuration;
        ......
        public boolean initialize() {
            this.kvConfigManager.load();
            this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService);
            this.remotingExecutor =
                Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactoryImpl("RemotingExecutorThread_"));
            this.registerProcessor();
            this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    NamesrvController.this.routeInfoManager.scanNotActiveBroker();
                }
            }, 5, 10, TimeUnit.SECONDS);
    
            this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    NamesrvController.this.kvConfigManager.printAllPeriodically();
                }
            }, 1, 10, TimeUnit.MINUTES);
    
            return true;
        }
    
        private void registerProcessor() {
            if (namesrvConfig.isClusterTest()) {
                this.remotingServer.registerDefaultProcessor(new ClusterTestRequestProcessor(this, namesrvConfig.getProductEnvName()),
                    this.remotingExecutor);
            } else {
    
                this.remotingServer.registerDefaultProcessor(new DefaultRequestProcessor(this), this.remotingExecutor);
            }
        }
    
        public void start() throws Exception {
            this.remotingServer.start();
    this.fileWatchService.start();
    }
    public void shutdown() { this.remotingServer.shutdown(); this.remotingExecutor.shutdown(); this.scheduledExecutorService.shutdown(); } ...... }

    检测broker,遍历,看最后修改时间,如果时间过长则删除,标记为不可用Broker

        public void scanNotActiveBroker() {
            Iterator<Entry<String, BrokerLiveInfo>> it = this.brokerLiveTable.entrySet().iterator();
            while (it.hasNext()) {
                Entry<String, BrokerLiveInfo> next = it.next();
                long last = next.getValue().getLastUpdateTimestamp();
                if ((last + BROKER_CHANNEL_EXPIRED_TIME) < System.currentTimeMillis()) {
                    RemotingUtil.closeChannel(next.getValue().getChannel());
                    it.remove();
                    log.warn("The broker channel expired, {} {}ms", next.getKey(), BROKER_CHANNEL_EXPIRED_TIME);
                    this.onChannelDestroy(next.getKey(), next.getValue().getChannel());
                }
            }
        }

    新版本增加了对于Tls的文件监听和自动重新加载,启动的时候在启动remoteserver的同时也启动this.fileWatchService.start();

            if (TlsSystemConfig.tlsMode != TlsMode.DISABLED) {
                // Register a listener to reload SslContext
                try {
                    fileWatchService = new FileWatchService(
                        new String[] {
                            TlsSystemConfig.tlsServerCertPath,
                            TlsSystemConfig.tlsServerKeyPath,
                            TlsSystemConfig.tlsServerTrustCertPath
                        },
                        new FileWatchService.Listener() {
                            boolean certChanged, keyChanged = false;
                            @Override
                            public void onChanged(String path) {
                                if (path.equals(TlsSystemConfig.tlsServerTrustCertPath)) {
                                    log.info("The trust certificate changed, reload the ssl context");
                                    reloadServerSslContext();
                                }
                                if (path.equals(TlsSystemConfig.tlsServerCertPath)) {
                                    certChanged = true;
                                }
                                if (path.equals(TlsSystemConfig.tlsServerKeyPath)) {
                                    keyChanged = true;
                                }
                                if (certChanged && keyChanged) {
                                    log.info("The certificate and private key changed, reload the ssl context");
                                    certChanged = keyChanged = false;
                                    reloadServerSslContext();
                                }
                            }
                            private void reloadServerSslContext() {
                                ((NettyRemotingServer) remotingServer).loadSslContext();
                            }
                        });
                } catch (Exception e) {
                    log.warn("FileWatchService created error, can't load the certificate dynamically");
                }
            }

    对于配置管理其实没啥好说的,主要看下路由管理可以看到主要数据还是保存在一个hashmap中

    从RocketMQ技术内幕书上截取的运行时系统存储信息示意图,非常清楚,可以看出内存结构中,包含了不同纬度的信息

  • 相关阅读:
    【转】linux shell I/O重定向小结
    vnc 最近打开
    [转]设置修改CentOS系统时区/时间
    【转】动态链接库、静态库区别与VS2005项目相关设置
    更改默认shell
    19个PHP模板引擎
    const char*, char const*, char*const的区别
    按任意键继续
    [转]CentOS设置服务开机自动启动
    centos 修改eth2为eth0
  • 原文地址:https://www.cnblogs.com/it-worker365/p/10078208.html
Copyright © 2020-2023  润新知