在群集中处理RabbitMQ节点故障以继续发布和使用

在群集中处理RabbitMQ节点故障以继续发布和使用,rabbitmq,Rabbitmq,我想创建一个高可用性集群,并在此集群前面放置一个负载平衡器。在我们的配置中,我们希望手动创建交换和队列,因此创建一个交换和队列,任何客户端都不应该调用来重新声明它们。我使用带有路由密钥的direct exchange,因此可以将消息路由到不同节点上的不同队列中。但是,我在集群和队列方面有一些问题 据我在RabbitMQ文档中所读到的,队列是特定于创建它的节点的。此外,在一个集群中,我们只能有一个同名的队列,该队列在发布/使用操作时应该是活动的。如果节点死亡,则该节点上的队列将消失,消息可能无法恢

我想创建一个高可用性集群,并在此集群前面放置一个负载平衡器。在我们的配置中,我们希望手动创建交换和队列,因此创建一个交换和队列,任何客户端都不应该调用来重新声明它们。我使用带有路由密钥的direct exchange,因此可以将消息路由到不同节点上的不同队列中。但是,我在集群和队列方面有一些问题

据我在RabbitMQ文档中所读到的,队列是特定于创建它的节点的。此外,在一个集群中,我们只能有一个同名的队列,该队列在发布/使用操作时应该是活动的。如果节点死亡,则该节点上的队列将消失,消息可能无法恢复(当然取决于配置)。因此,即使我将相同的消息路由到不同节点中的不同队列,我仍然必须找出如何使用它们以继续使用消息

我想知道是否可以在不使用镜像队列的情况下处理此故障切换场景。假设我希望在发生故障时切换到新节点,并继续从同一队列中使用。因为publisher只是在使用路由密钥,而且这些消息可以进入多个队列,所以对于使用者来说,不可能出现相同的情况

简言之,在第一段中解释的环境中,我可以如何应对失败。队列镜像是集群中性能下降的最佳方法,或者存在更实用的解决方案?

数据复制(RabbitMQ中的镜像队列)是实现高可用性的标准方法。我建议用那些。如果不复制数据,就会丢失数据

如果您担心性能-RabbitMQ不能很好地扩展。 我所知道的提高性能的唯一方法就是将节点变大或创建第二个集群。向集群添加节点并不能真正改善情况。此外,如果您计划使用TLS,它也会显著降低吞吐量。如果你有高吞吐量要求+HA,我会考虑Apache卡夫卡。 如果您的用例允许不关心HA,那么只要在您的消费者/发布者连接到代理时重新声明队列/交换,这是绝对正确的。当您声明已经存在的队列时,不会发生任何错误,队列不会被清除等,exchange也是如此


另外,请检查,这可能对您的用例有用。

因此,重新声明节点中的现有exchange/队列(如果它不可dutable)是幂等的,并且无论何时建立新连接,都可以重新声明,对吗?这是你的建议吗?@Deniz是的,只需声明客户需要的队列/交换。Publisher只需声明exchange即可。消费者应申报交换并排队,谢谢Alex提供的提示。我认为不可能重新声明持久队列,因此您的解决方案对非持久队列有效,对吗?@Deniz是的,没错。您仍然可以为持久队列发出
queue.declare
命令,您只需得到错误响应即可。你只要确定队列在那里就行了