RocketMQ的NameServer原理

1.NameServer架构

在这里插入图片描述

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

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

2.1 路由元信息

在这里插入图片描述

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,而是由客户端定时拉取最新的路由信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Minor王智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值