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

  • 相关阅读:
    抽奖系统 random()
    JavaScript 稀奇的js语法
    Node初识笔记 1第一周
    vue 自定义指令
    vue 组件 单选切换控制模板 v-bind-is
    学习网址
    vue 组件 子向父亲通信用自定义方法用事件监听
    vue 组件 模板中根数据绑定需要指明路径并通信父
    vue 组件 模板input双向数据数据
    测试样式
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14725260.html
Copyright © 2011-2022 走看看