zoukankan      html  css  js  c++  java
  • Rocketmq客户端怎么选择Nameserver

    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

  • 相关阅读:
    js中面向对象的写法
    js中防止全局变量被污染的方法
    移动端的头部标签和meta
    励志
    UX是什么?
    HTTP
    Django RestFramework (DRF)
    Vue(一)
    Vue-基础
    Vue-es6基础语法
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14725260.html
Copyright © 2011-2022 走看看