NameServer作为RocketMQ的注册中心,主要存储哪些信息,如何存储,信息变化时如何通知?下面我们就带着这些问题一起来分析一下NameServer。NameServer记录的信息就是RocketMQ的注册中心。NameServer主要存储queue和Topic关系列表、broker列表、cluster和broker关系列表、当前存活的broker列表publicclassRouteInfoManager{//Broker向NameServer上报心跳的最长时间privatefinalstaticlongBROKER_CHANNEL_EXPIRED_TIME=1000*60*2;privatefinalReadWriteLocklock=newReentrantReadWriteLock();//主题和队列的关系列表,其中有读队列和写队列privatefinalHashMap>topicQueueTable;privatefinalHashMapbrokerAddrTable;//所有broker信息privatefinalHashMap>clusterAddrTable;//包括哪些broker每个集群//当前存活的broker,因为nameserver每10S扫描一次,会有延迟privatefinalHashMapbrokerLiveTable;//记录每个Broker使用了哪些消息过滤服务器privatefinalHashMap/*FilterServer*/>filterServerTable;}topicQueueTable:每个topic属于哪个broker;每个主题下有多少队列;每个队列的读写数和权限brokerAddrTable:每个brokerid和address的关系会区分broker的master和slaveclusterAddrTable:每个cluster包含的broker。BrokerLiveTable:当前存活的经纪商会有一定的延迟。filterServerTable:每个Broker使用了哪些消息过滤服务器?如果上述数据发生变化,NameServer会如何处理呢?答案是通过BrokerHousekeepingService来监听,BrokerHousekeepingService实现了ChannelEventListener接口。如果channel发生变化,比如Nameserver和Broker的连接channel关闭,channel发送异常,或者channel空闲,都会触发BrokerHousekeepingService的回调,然后移除对应的BrokerII。,NameServer的工作机制RocketMQ的路由信息??主要是指Topic的队列信息,即队列分布在哪个Broker中。NameServer命名服务,集群部署,节点间不通信Broker消息服务器,发送心跳信息每30S向NameServer发送Producer、Consumer消息客户端,同时只连接一台NameServer服务器,每30S更新一次topic信息NameServer启动后,每10S扫描一次Broker集群。如果一定时间内(120S)没有收到Broker心跳消息,NameServer会移除Broker,提高消息发送的高可用。这是典型的PULL模式,而ZK是PUSH模式。ZK是一种通过事件机制实现的PUSH模式。这种模式的一个优点是它是实时的。一旦服务器发生变化,客户端可以立即发布。ZK的通知,但是这种强制牺牲了可用性,会导致服务在一定时间内不可用。但是PULL模式也有它的问题。如果NameServer存储的路由信息??发生变化,它不会主动通知客户端。另一方面,客户端需要主动拉取最新的路由信息??(一定频率的定时任务拉取),显然是不及时的。RocketMQ如何应对?答案是通过客户端的重试和Broker的规避策略(可以参考前面写的RocketMQ学习四消息发送高可用设计)。我们可以分析NameServer集群信息不一致对消息发送者和消息消费者的影响。对发送端的影响假设如下场景:由于某些原因,Namerserver-2中的broker信息只能被broker-a使用。对于消息发送端,Producer-1可以向broker-a和broker-b发送消息。Consumer-2可以正常消费,而Producer-2只能向broker-a发送消息,而Consumer-1只能在broker-a上消费消息,所以这样的后果就是压力都在broker-a身上,而serviceIt仍然可用,人工干预后问题可以解决。因此,NameServer集群的路由信息??不一致不会导致消息发送不通。对consumer端的影响(待定,这块需要看完broker和consumer再写,需要搞清楚重复消费)参考文章:RocketMQ4.0源码分析-路由管理Nameserver背后的设计理念