码迷,mamicode.com
首页 > 其他好文 > 详细

Rocketmq客户端怎么选择Nameserver

时间:2021-05-04 15:36:47      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:remoting   客户端   特点   主备   客户   注意   class   通信   其他   

Rocketmq没有选择使用zookeeper作为注册中心,而是自行开发NameServer就是为了实现方便,NameServer的最大特点就是它没有主从主备的概念,每个NameServer之间的数据甚至可以是不同的。

那么客户端在选择NameServer时的策略时什么样的呢?

RocketMQ会将用户设置的NameServer列表会设置到NettyRemotingClient类的namesrvAddrList字段中,NettyRemotingClient是RocketMQ对Netty进行了封装,如下:

private final AtomicReference<List<String>> namesrvAddrList = new AtomicReference<List<Strin

具体选择哪个NameServer,也是使用round-robin的策略。需要注意的是,尽管使用round-robin策略,但是在选择了一个NameServer节点之后,后面总是会优先选择这个NameServer,除非与这个NameServer节点通信出现异常的情况下,才会选择其他节点。

为什么客户端不与所有NameServer节点建立连接呢,而是只选择其中一个?笔者考虑,通常NameServer节点是固定的几个,但是客户端的数量可能是成百上千,为了减少每个NameServer节点的压力,所以每个客户端节点只随机与其中一个NameServer节点建立连接。

为了尽可能保证NameServer集群每个节点的负载均衡,在round-robin策略选择时,每个客户端的初始随机位置都不同,如下:

private final AtomicInteger namesrvIndex = new AtomicInteger(initValueIndex());

 

如果某个NameServer节点创建连接失败是,会自动重试其他节点。具体可参见:getAndCreateNameserverChannel

 

Rocketmq客户端怎么选择Nameserver

标签:remoting   客户端   特点   主备   客户   注意   class   通信   其他   

原文地址:https://www.cnblogs.com/juniorMa/p/14725260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!