【发布时间】:2020-02-11 17:55:49
【问题描述】:
我创建了 rabbitmq 集群。三个节点一主二从。当主人去世时,谁来决定哪个奴隶是新主人。谁是集群管理员?以及如何从集群中获取数据。我可以从集群中的每个节点获取消息,但是例如:我正在从主节点获取数据,但是当主节点死亡时,我需要手动连接到其他节点。但是我想连接到集群并且每当主节点死亡时,我可以从另一个节点获取消息?
【问题讨论】:
标签: python java rabbitmq cluster-computing
我创建了 rabbitmq 集群。三个节点一主二从。当主人去世时,谁来决定哪个奴隶是新主人。谁是集群管理员?以及如何从集群中获取数据。我可以从集群中的每个节点获取消息,但是例如:我正在从主节点获取数据,但是当主节点死亡时,我需要手动连接到其他节点。但是我想连接到集群并且每当主节点死亡时,我可以从另一个节点获取消息?
【问题讨论】:
标签: python java rabbitmq cluster-computing
如果队列主节点停止,您的应用程序将收到“连接丢失”异常。然后,您可以根据此异常操作以连接到集群中的任何其他节点。
您无需了解任何有关“集群管理器”的信息。只需连接到另一个节点。
RabbitMQ Java 客户端库支持自动恢复连接和拓扑。
注意:RabbitMQ 团队会监控 rabbitmq-users mailing list,并且仅有时会回答 StackOverflow 上的问题。
【讨论】:
没有像“集群管理器”这样的东西。 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);
}
【讨论】: