NameServer架构

1.架构设计

Broker 消息服务器在启动时向所有Name Server 注册,消息生产者(Producer)在发送消 息之前先从Name Server获取Broker 服务器地址列表,然后根据负载算法从列表中选择一 台消息服务器进行消息发送。NameServer 与每台Broker服务器保持长连接,并间隔30s 检 测Broker 是否存活,如果检测到Broker 宕机, 则从路由注册表中将其移除。但是路由变化不会马上通知消息生产者,这样降低NameServer 实现的复杂性,在消息发送端提供容错机制来保证消息发送的高可用性。

NameServer 本身的高可用可通过部署多台Namesrver 服务器来实现,但彼此之间互不通信,也就是NameServer服务器之间在某一时刻的数据并不会完全相同,但这对消息发送不会造成任何影响,这也是RocketMQ NameServer 设计的一个亮点,RocketMQNameServer 设计追求简单高效。

2.NameServer的路由注册和故障剔除

RocketMQ 基于订阅发布机制, 一个Topic 拥有多个消息队列,一个Broker 为每一主题默
认创建4 个读队列4 个写队列。多个Broker 组成一个集群, BrokerName 由相同的多台Broker
组成Master-Slave 架构, brokerId 为0 代表Master , 大于0 表示Slave 。BrokerLivelnfo 中的
lastUpdateTimestamp 存储上次收到Broker 心跳包的时间。

2.1 路由注册

RocketMQ 路由注册是通过Broker 与Name Server 的心跳功能实现的。Broker 启动时
向集群中所有的NameServer 发送心跳语句,每隔3 0s 向集群中所有NameServer 发送心
跳包, NameServer 收到Broker 心跳包时会更新brokerLiveTable 缓存中BrokerLivelnfo 的
lastUpdateTimestamp ,然后NameServer 每隔10s 扫描brokerLiveTable ,如果连续120s 没有收到心跳包, NameServer将移除该Broker 的路由信息同时关闭Socket 连接。

设计亮点

NameServe 与Broker 保持长连接,Broker状态存储在brokerLiveTable 中,NameS erver 每收到一个心跳包,将更新brokerLiveTable 中关于Broker 的状态信息以及路由表(topicQueueTable 、brokerAddrTable 、brokerLiveTable 、filterServerTable )。更新上述路由表( HashTable )使用了锁粒度较少的读写锁,允许多个消息发送者(Producer )并发读,保证消息发送时的高并发。但同一时刻NameServer 只处理一个Broker 心跳包,多个心跳包请求串行执行。

2.2路由删除

(1)NameServer 每隔10s 扫描brokerLiveTable ,如果连续120s 没有收到心跳包, NameServer将移除该Broker 的路由信息同时关闭Socket 连接。
(2)Broker 在正常被关闭的情况下,会执行unregisterBroker 指令。

2.3路由发现

RocketMQ 路由发现是非实时的,当Topic 路由出现变化后, NameServer 不主动推送给客户端, 而是由客户端定时拉取主题最新的路由。根据主题名称拉取路由信息的命令编码为: GET_ROUTEINTO_BY_TOPIC.客户端默认会每30秒更新路由信息,每30秒向NameServer发送心跳包。

总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值