前言
之前三篇已经从Producer、Broker、Consumer三者角度出发分析了RocketMQ框架的高可用,本篇简单介绍RocketMQ中的高可用地方。之前对NameServer已经做过详细的分析,就简单的介绍一下吧。
所有高可用部分总结
一、NameServer高可用
NameServer作为路由注册中心,与Producer、Broker、Consumer都建立了长连接,来进行互相之间的通信。并且,NameServer本身就是由多台服务器组成的集群,集群中每台服务器中数据都是一致的,并且互不影响,从而达到NameServer的高可用。
因此,Broker向NameServer注册的时候需要向每个NameServer都注册自己的信息。在Producer生产或者Consumer消费的时候只需要连接其中一台NameServer进行通信获得路由信息即可。下面具体来看看这部分的代码。
1.1 Broker注册路由信息
1 | public List<RegisterBrokerResult> registerBrokerAll( |
1.2 Producer通过NameServer选择消息队列
在之前分析RocketMQ源码学习之高可用分析(一)文章中我们关注的重点是两种容错机制,在此之前Producer还需要通过NameServer获得所有的指定topic的消息队列所在的Broker的地址才能进行选择,也就是之前那篇文章中断点1的部分,我们deep进去,函数之间的调用逻辑比较复杂,如下:
1 | sendDefaultImpl()--->tryToFindTopicPublishInfo()--->updateTopicRouteInfoFromNameServer()--->getTopicRouteInfoFromNameServer()--->invokeSync()--->getAndCreateChannel()--->getAndCreateNameserverChannel() |
来看最终的这个函数
1 | private Channel getAndCreateNameserverChannel() throws RemotingConnectException, InterruptedException { |
至此,便连接上了一台NameServer服务器用于获得对应的路由表。
1.3 Consumer通过NameServer选择消息队列
与Producer类似的,在消费端进行消费的时候,也是通过相同的函数getAndCreateNameserverChannel()来获得某个NameServer服务器,从而获得路由表信息,这边就不赘述了。