RocketMQ之NameServer

RocketMQ的NameServer作为路由中心,负责管理和服务发现。它与所有Broker建立长连接,Broker启动时向NameServer注册,心跳维持连接。NameServer中的RoutInfoManager保存路由元数据,包括topic消息队列、Broker状态等信息。路由注册时,Broker定期发送心跳,NameServer接收到请求后更新路由表。路由删除则基于心跳超时或Broker正常关闭。客户端按需主动拉取路由信息。
摘要由CSDN通过智能技术生成

引言
消息生产者怎么得知消息会发往哪台服务器?如果服务器宕机,生产者如何感知?

NameServer:路由中心。
提供路由管理、服务注册与服务发现的机制,使消费者找到远程的生产者,完成网络通信。
在这里插入图片描述
每个NameServer都会和所有的Broker连接,NameServer之间互不相连,同一时刻NameServer之间的数据可能并不相同。
当Broker启动时,先向 所有NameServer注册,二者之间保持长连接。当Producer要发送信息时,先从NameServer查,再根据负载均衡算法选择Broker发送消息。

NameServer启动流程

  1. 获取业务参数NameSrvConfig和网络参数NettyServerConfig,获取启动属性。
  2. 创建NamesrvController实例并初始化,该类用于控制NameServer。初始化过程中,加载kvconfig配置,创建Netty网络处理对象;开启定时任务:(1)每10s扫描一次是否有不活跃的Broker移除(2)每10s打印一次kv配置
  3. 创建ShutdownHook,启动服务器。

RoutInfoManager

在上述启动流程中,我们是通过RoutInfoManager类获取Broker信息的,RoutInfoManager类中存放了路由元数据信息。

    private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
    private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
    private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
    private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
    private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

类中包含了五个HashMap:
topicQueueTable:Topic消息队列路由信息,发送消息时根据该表进行负载均衡发送到不同队列。(一个topic包含多个消息队列)
brokerAddrTable:BrokerName,所属集群,主备地址。
clusterAddrTable:Broker集群信息
brokerLiveTable:Broker状态信息,根据收到的Broker心跳包进行更新。
filterServerTable:消息过滤

BrokerData中包含一个HashMap,表示Master-Slave结构:

    private HashMap<Long/* brokerId */, String/* broker address */> brokerAddrs;

brokerId=0为master,brokerId>0为slave。

路由注册

当Broker启动时,它会通过一个定时任务,每隔30s向所有nameServer发送心跳包。调用BrokerOuterAPI的r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值