美文网首页
RocketMQ | 路由中心NameServer

RocketMQ | 路由中心NameServer

作者: 暴走的朝天椒 | 来源:发表于2021-03-18 18:52 被阅读0次

    RocketMQ的路由中心存储的是什么数据呢?
    作为一款高性能的消息中间件,如何避免NameServer的单点故障,提供高可用性呢?

    NameServer架构设计

    rocketmq-nameserver架构设计.jpg

    消息中间件的设计思路一般基于主题的订阅发布机制,消息生产者(Producer)发送某一主题的消息到消息服务器,消息服务器负责该消息的持久化存储,消息消费者(Consumer)订阅感兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者(PUSH模式)或者消息消费者主动向消息服务器拉取消息(PULL模式),从而实现消息生产者与消息消费者解耦。

    Broker消息服务器在启动时向所有NameServer注册,消息生产者(Producer)在发送消息之前先从NameServer获取Broker服务器地址列表,然后根据负载算法从列表中选择一台消息服务器进行消息发送。NameServer与每台Broker服务器保持长连接,并间隔30s检测Broker是否存活,如果检测到Broker宕机,则从路由注册表中将其移除。

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

    NameServer路由注册、故障剔除

    路由元信息

    路由元数据.jpg

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

    路由注册、路由删除、路由发现

    rocketmq-NameServer处理心跳包-流程图.png
    • 路由注册

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

    • 路由删除

    Broker每隔30s向NameServer发送一个心跳包,心跳包中包含BrokerId、Broker地址、Broker名称、Broker所属集群名称、Broker关联的FilterServer列表。但是如果Broker宕机,NameServer无法收到心跳包,此时NameServer如何来剔除这些失效的Broker呢?Name Server会每隔10s扫描brokerLiveTable状态表,如果BrokerLive的lastUpdateTimestamp的时间戳距当前时间超过120s,则认为Broker失效,移除该Broker,关闭与Broker连接,并同时更新topicQueueTable、brokerAddrTable、brokerLiveTable、filterServerTable。

    RocktMQ有两个触发点来触发路由删除。
    1)NameServer定时扫描brokerLiveTable检测上次心跳包与当前系统时间的时间差,如果时间戳大于120s,则需要移除该Broker信息。
    2)Broker在正常被关闭的情况下,会执行unregisterBroker指令。

    • 路由发现

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

    相关文章

      网友评论

          本文标题:RocketMQ | 路由中心NameServer

          本文链接:https://www.haomeiwen.com/subject/agypcltx.html