【发布时间】:2013-12-17 23:53:42
【问题描述】:
我正在尝试实现一种“独占消费者”或“独占队列”,以避免最终用户必须固定任何东西:代理将选择一个消息消费者来获取队列的所有消息,以确保 ordering,如果该消费者失败,代理将自动故障转移并选择另一个消费者。
我想知道 Celery 和 RabbitMQ 的组合是否可以做到。
【问题讨论】:
我正在尝试实现一种“独占消费者”或“独占队列”,以避免最终用户必须固定任何东西:代理将选择一个消息消费者来获取队列的所有消息,以确保 ordering,如果该消费者失败,代理将自动故障转移并选择另一个消费者。
我想知道 Celery 和 RabbitMQ 的组合是否可以做到。
【问题讨论】:
尽管意识到这个问题已经超过 7 年了,但有人可能会像我一样偶然发现这个页面。因此,在 2019 年,RabbitMQ 团队发布了 3.8 版本,该版本支持名为“单一活动消费者”的新功能。它提供的正是这种类型的消费者排他性与自动回退行为相结合,其中下一个(随机选择的)收听队列的消费者将在第一个消费者因任何原因掉线或断开连接时成为“单一活动消费者”。并且此功能不需要对消息队列本身进行任何复杂的设置;它几乎适用于任何队列。
在https://www.cloudamqp.com/blog/2019-04-23-rabbitmq-3-8-feature-focus-single-active-consumer.html 和https://www.rabbitmq.com/consumers.html#single-active-consumer 了解更多信息
【讨论】:
虽然 RabbitMQ 有“独占”队列的概念,但我认为您无法获得所需的回退行为。
代理不会“选择”单个消费者。可以通过不使用自动 ACK、拒绝错误并让您的工作人员死亡/重新启动来解决故障模式。
如果只有一个消费者,这会保留消息顺序。通过负载平衡,您的里程可能会有所不同。
【讨论】: