【问题标题】:Handling RabbitMQ node failures in a cluster in order to continue publishing and consuming处理集群中的 RabbitMQ 节点故障以继续发布和消费
【发布时间】:2017-05-09 16:17:56
【问题描述】:

我想创建一个集群以实现高可用性,并在该集群前面放置一个负载平衡器。在我们的配置中,我们想手动创建交换和队列,因此创建了一个交换和队列,没有客户端应该调用重新声明它们。我正在使用带有路由键的直接交换,因此可以将消息路由到不同节点上的不同队列中。但是,我在集群和队列方面存在一些问题。

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

我想知道是否可以在不使用镜像队列的情况下处理这种故障转移场景。假设我想在发生故障时切换到新节点并继续从同一个队列中消费。因为发布者只是使用路由键,这些消息可以进入多个队列,消费者不可能出现同样的情况。

简而言之,我该如何应对第一段中解释的环境中的故障​​。队列镜像是集群中性能损失的最佳方法还是存在更实用的解决方案?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

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

    如果您担心性能 - RabbitMQ 不能很好地扩展。 我知道提高性能的唯一方法就是使您的节点更大或创建第二个集群。将节点添加到集群并不能真正改善事情。此外,如果您计划使用 TLS,它也会显着降低吞吐量。如果您有高吞吐量要求+HA,我会考虑使用 Apache Kafka。

    如果您的用例允许不关心 HA,那么只需在您的消费者/发布者连接到代理时重新声明队列/交换,这绝对没问题。当您声明已经存在的队列时,不会发生任何错误,队列不会被清除等,与交换相同。

    另外,请查看RabbitMQ sharding plugin,也许这对您的用例有用。

    【讨论】:

    • 所以在节点中重新声明一个现有的交换/队列(如果它不是dutable)是幂等的,每当建立新的连接时都可以重新声明,对吧?这是你的建议吗?
    • @Deniz 是的,只需声明您的客户需要的队列/交换。发布者只需要声明交换。消费者应声明交换和队列
    • 感谢亚历克斯的提示。我认为重新声明持久队列是不可能的,所以您的解决方案对非持久队列有效吗?
    • @Deniz 是的,没错。您仍然可以为持久队列发出queue.declare 命令,您只会得到错误响应,这很好。你只要确保队列在那里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多