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