RocketMQ系列(三)---RocketMQ路由中心NameServer

本文深入探讨RocketMQ的NameServer,详细介绍了其作为路由中心的功能,包括NameServer的职责、路由中间件设计思路、启动流程以及路由的注册、删除和发现过程。NameServer负责管理和维护配置信息,各个角色向其注册状态,并实现高可用部署。
摘要由CSDN通过智能技术生成

目录

一、NameServer功能

二、路由中间件设计思路

三、NameServer启动流程

四、路由注册

1、路由元信息

2、路由注册

3、路由删除

4、路由发现


一、NameServer功能

(路由管理,路由注册,服务发现)

1、为了管理和维护配置信息,状态信息,集群中的各个组件,通过它来了解全局信息。
2、各个角色定期向NameServer上报自己的状态,超时未上报的视为不可用
3、NameServer可部署多个,相互独立,每个角色可同时向多个报备状态,达到热备份。nameserver本身无状态,相关组件的状态信息不会持久化,存储在内存中,但它本身支持配置参数的持久化,这个一般用不到。

二、路由中间件设计思路

设计思路:

 

RocketMQ物理部署图:

RocketMQ物理部署图

    NameServer本身可部署多台实现高可用,彼此之间不通信,所以某一时刻二者的数据并不完全相同,但对消息发送和接收无影响,可以通过其他ack机制确保操作成功。
    这样设计简单高效,一般NameServer先启动,broker后启动,启动后向所有的NameServer注册,produce发送消息时,会先从NameServer获取可用的broker地址,根据负载算法选择一个并发送。
    NameServer与每台Broker服务器保持长连接并间隔30秒,检测Broker是否存活,如果检测到Broker宕机,则从路由注册表中将其移除,但是路由变化不会马上通知消息生产者,这样设计,降低了NameServer实现的复杂性,在消息发送端提供其他容错机制来保证消息发送的高可用性。

三、NameServer启动流程

NameServer源码结构:

NameServer启动源代码:

NamesrvController controller = createNamesrvController(args);
start(controller);
public static NamesrvController createNamesrvController(String[] args) throws IOException, JoranException {
        
        //………省略………
        //初始化和加载这连个关键的配置
        final NamesrvConfig namesrvConfig = new NamesrvConfig();
        final NettyServerConfig nettyServerConfig = new NettyServerConfig();
        nettyServerConfig.setListenPort(9876);
        if (commandLine.hasOption('c')) {
            String file = commandLine.getOptionValue('c');
            if (file != null) {
                InputStream in = new BufferedInputStream(new FileInputStream(file));
                properties = new Properties();
                properties.load(in);
                MixAll.properties2Object(properties, namesrvConfig);
                MixAll.properties2Object(properties, nettyServerConfig);

                namesrvConfig.setConfigStorePath(file);

                System.out.printf("load config properties file OK, %s%n", file);
                in.close();
            }
        }

        if (commandLine.hasOption('p')) {
            InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_CONSOLE_NAME);
            MixAll.printObjectProperties(console, namesrvConfig);
            MixAll.printObjectProperties(console, nettyServerConfig);
            System.exit(0);
        }

        //………省略………

        final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig);

        // remember all configs to prevent discard
        controller.getConfiguration().registerConfig(properties);

        return controller;
    }
    public static NamesrvController start(final NamesrvController controller) throws Exception {

        if (null == controller) {
            throw new IllegalArgumentException("NamesrvController is null");
        }

        boolean initResult = controller.initialize();
        if (!initResult)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值