【问题标题】:Who is rabbitmq cluster manager? How can I get data from cluster?rabbitmq集群管理员是谁?如何从集群中获取数据?
【发布时间】:2020-02-11 17:55:49
【问题描述】:

我创建了 rabbitmq 集群。三个节点一主二从。当主人去世时,谁来决定哪个奴隶是新主人。谁是集群管理员?以及如何从集群中获取数据。我可以从集群中的每个节点获取消息,但是例如:我正在从主节点获取数据,但是当主节点死亡时,我需要手动连接到其他节点。但是我想连接到集群并且每当主节点死亡时,我可以从另一个节点获取消息?

【问题讨论】:

    标签: python java rabbitmq cluster-computing


    【解决方案1】:

    如果队列主节点停止,您的应用程序将收到“连接丢失”异常。然后,您可以根据此异常操作以连接到集群中的任何其他节点。

    您无需了解任何有关“集群管理器”的信息。只需连接到另一个节点。

    RabbitMQ Java 客户端库支持自动恢复连接和拓扑。


    注意:RabbitMQ 团队会监控 rabbitmq-users mailing list,并且仅有时会回答 StackOverflow 上的问题。

    【讨论】:

      【解决方案2】:

      没有像“集群管理器”这样的东西。 RabbitMQ 集群中的节点使用 Raft 算法进行分布式共识并选举其领导者(参见http://thesecretlivesofdata.com/raft)。

      另一方面,RabbitMQ Java Client API 已经可以像您提出的场景一样管理断开连接。默认情况下,新连接是可恢复的(请参阅https://www.rabbitmq.com/api-guide.html#connection-recovery)。

      您可以使用这个 sn-p 作为示例来创建到多个节点的连接(addressesStr 列表中的每个字符串应该类似于 node_ip:port):

        public Connection crateConnection(final List<String> addressesStr)
            throws IOException, TimeoutException {
          final ConnectionFactory factory = new ConnectionFactory();
          final List<Address> addresses = new ArrayList<>();
      
          for (final String address : addressesStr) {
            final String[] addr = address.split(":");
            final String host = addr[0];
            final var port = Integer.parseInt(addr[1]);
            addresses.add(new Address(host, port));
          }
      
          return factory.newConnection(addresses);
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-11
        • 1970-01-01
        • 2019-04-04
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多