【问题标题】:RabbitMQ single active consumer with passive failover consumersRabbitMQ 单个主动消费者和被动故障转移消费者
【发布时间】:2015-11-10 07:04:28
【问题描述】:

我有一个可以水平缩放的 API。 API 将确认客户端请求,并且需要将工作分派到辅助系统。辅助系统需要在先到先得的基础上处理工作,即队列。此外,由于辅助系统正在访问可以共享的资源,因此只有一个实例可以在给定时间处于活动状态。辅助系统需要具有故障转移机制。如果辅助系统的第一个实例出现故障,则需要另一个实例来代替它。

我正在考虑使用 RabbitMQ 作为排队机制,让多个消费者连接,但只有一个活跃的消费者来处理工作。如果先前活动的消费者未能确认消息,则其他实例之一将承担处理消息的工作。 RabbitMQ 可以吗?

也可以在作业完成后才确认消息吗?

谢谢。

【问题讨论】:

  • 很抱歉在这里重新提出一个老问题,但我也有这种情况,想知道你是否找到了解决这个问题的方法?卡尔

标签: rabbitmq scalability


【解决方案1】:

这在 RabbitMQ 的新版本中是可能的: https://www.rabbitmq.com/consumers.html#single-active-consumer

【讨论】:

    【解决方案2】:

    这在 RabbitMQ 中无法直接实现,这是您想要的方式。

    一个队列可以有多个消费者。但是,RabbitMQ 会将消息传递给任何可用于工作的消费者。换句话说,如果您有 3 个消费者并向队列发送 3 条消息,那么这些消费者中的每一个都可能会收到 1 条消息。

    如果您确实需要消费者的主动/被动故障转移,您将需要使用另一个系统来管理和监控消费者的实例。

    关于确认正在完成的工作:是的。通过将no_ack 设置为true,使您的队列进入确认模式。这将要求您确认来自消费者的每条消息。您可以保留该消息直到工作完成,然后在工作完成时确认该消息。

    请参阅 RabbitMQ 文档中的 worker queue 示例,了解使用确认的示例,并简要讨论向消费者发送循环消息。

    【讨论】:

    • 谢谢德里克。另一种方法是我正在考虑将 prefetch_count 设置为 1。据我所知,这会将消息传递给消费者并等待发送 ack 以传递队列中的下一条消息。这将保证在给定时间,所有消费者只处理 1 条消息?
    • 预取计数将限制给定通道(基本上是消费者)中未确认消息的数量。如果您有 3 个消费者实例,并且每个实例的预取为 1,那么您当前将有多达 3 条消息正在处理
    • 今天这不再正确,最好的答案现在来自 deepak pundir。 RabbitMQ 有两个特性:单一活跃消费者 (SAC) rabbitmq.com/consumers.html#single-active-consumer 和独占消费者 rabbitmq.com/consumers.html#exclusivity。我推荐 SAC。
    【解决方案3】:

    在这种情况下,我建议将消息​​复制到队列中,例如。如果您有 3 个消息消费者,最好构建 3 个队列并通过交换器在这 3 个队列上复制消息。



    也可以仅在作业完成后确认消息吗?
    是的,您可以在您的代码中移动 ack,在您的情况下,在详细说明消息之后。

    【讨论】:

    • 感谢您的回复。通过拥有 3 个消费者,所有消费者都将处理该消息。如果主要消费者出现故障,我希望有一个消费者负责处理,其他消费者负责处理。
    • 我不明白。只有 1 个工作,另外 2 个唤醒只有“1”下降?对吗?
    【解决方案4】:

    由于尚未提及,Consumer Priorities 在这种情况下可能会为您提供足够的帮助。这取决于根据您的定义,未能确认消息的主要消费者是否等于 RabbitMQ 认为处于阻塞状态的消费者。还有一点关于这个here的讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2011-04-15
      • 2016-05-19
      • 1970-01-01
      相关资源
      最近更新 更多