RocketMQ的NameServer原理

目录

  • 1.NameServer架构
  • 2.NameServer路由和注册、剔除机制
    • 2.1 路由元信息
    • 2.2 路由注册
    • 2.3 路由剔除
    • 2.4 路由发现

1.NameServer架构

RocketMQ的NameServer原理_第1张图片

NameServer是RocketMQ的大脑,Producer如何知道消息要往那台服务器发送数据?如果Broker宕机了,Producer如何感知?等等这些问题都需要NameServer来解决。
NameServer本身的高可用是通过部署集群的方式来实现,但是NameServer节点之间互不通信,也就是说在某一个时刻NameServer服务器之间不会完全相同,但是不会对消息发送造成影响。RocketMQ之所以这么设计是为了追求简单高效。

2.NameServer路由和注册、剔除机制

2.1 路由元信息

RocketMQ的NameServer原理_第2张图片

RouteInfoManager路由的元数据信息都是一个个的HashMap。

  - topicQueueTable:Topic消息队列路由信息,消息发送时根据路由表进行负载均衡。
  - brokerAddrTable:Broker基础信息,包含了BrokerName、集群名称、主备Broker地址等。
  - clusterAddrTable:Broker集群信息。
  - brokerLiveTable:Broker状态信息,NameServer每次收到心跳包时会替换该信息。
  - filterServerTable:用于类模式消息过滤,保存Broker上的饿FilterServer列表。

2.2 路由注册

RocketMQ的路由注册是通过Broker和NameServer的心跳功能实现的,Broker启动时向集群中所有的NameServer发送心跳请求,每隔30s向集群中所有NameServer发送心跳包,NameServer收到Broker的心跳包时会更新BrokerLiveTable中的时间戳信息,然后NameServer每隔10s扫描这个BrokerLiveTable,如果连续120s没有更新这个时间戳的Broker,NameServer就会移除该Broker的路由信息同时关闭Socket连接。
NameServer在操作BrokerLiveTable这个Map的时候是通过读写锁来完成的,因为这个状态信息属于是读远大于写的场景,NameServer同一时刻只处理一个Broker的心跳包,所有Broker心跳包串行执行。

2.3 路由剔除

Broker每隔30s向NameServer发送心跳信息,NameServer后台线程每隔10s来检查BrokerLiveTable这个表,如果存在超过120s都未更新时间戳的Broker就会被NameServer认定为故障,被移除掉并关闭网络连接,并同时更新TopicQueueTable、BrokerAddrTable、BrokerLiveTable等。
另外,如果Broker正常关闭退出,也会主动触发路由剔除。

2.4 路由发现

RocketMQ的路由发现是非实时的,当Topic路由出现变动后,NameServer并不会主动通知Producer,而是由客户端定时拉取最新的路由信息。

你可能感兴趣的:(MQ,java-rocketmq,rocketmq,java,面试,中间件)