【问题标题】:rabbitmq multiple consumers on a queue- only one get the messagerabbitmq 队列上有多个消费者 - 只有一个收到消息
【发布时间】:2015-12-28 03:41:32
【问题描述】:

我实现了多个消费者,他们从单个队列中获取消息,我正在使用类似于 this example 的东西来执行此操作,除了我在无限循环上执行 basic.get 以进行轮询。

知道如何防止所有消费者之间的竞争,因为只有一个消费者会收到消息,而另一个消费者会继续进行轮询,直到另一条消息到来?
我尝试实现一个逻辑,在该逻辑中,一旦我收到消息,我就确认它以删除消息,但似乎其他一些队列在第一个队列确认并删除它之前设法获取了消息。 所以每个消费者都收到了消息。

提前致谢

【问题讨论】:

  • 如何在队列中发布消息?你是怎么吃的?我是否正确理解所有您的消费者收到消息,而不仅仅是一个 - 但您希望只有一个客户收到它?还是只有一个客户收到消息,而您希望每个人都收到?
  • 使用 channel.basic_publish -direct 发布,routing_key 使用 basic_get 使用它,就像上面的示例一样
  • 我所有的消费者都会收到消息,我希望第一个收到消息的人会处理它,并且只有一个消费者会从队列中获取每条消息,即可用的那个

标签: python rabbitmq amqp pika


【解决方案1】:

知道如何防止所有消费者之间的竞争,因为只有一个消费者会收到消息,而另一个消费者会继续进行轮询,直到另一条消息到来?

你不能,你设置的方式。 RabbitMQ 会将消息轮询发送给消费者,但只有一个消费者会从队列中接收消息。这是 RabbitMQ 设计的,当您在一个队列上有多个消费者时。

如果您需要所有消费者接收所有消息,那么您需要更改配置,以便每个消费者都有自己的队列。然后,您需要通过交换器发布消息,该交换器将消息传递到所有消费者的所有队列。

最简单的方法是使用 Fanout 交换类型。

【讨论】:

  • “但只有一个消费者会收到来自队列的消息”这正是我想要的,但它没有发生。无论如何,我添加了channel.basiq_qos(prefetch_count=1),现在似乎只有一个消费者收到了消息,而不是全部
  • 在一个频道上将prefetch_count 设置为1 并在该频道上有多个消费者并关闭auto_ack 就可以完成这项工作。只有一个活跃的消费者将持有一条消息,而其他消费者将等待。请注意,它仅在消费者位于同一频道时才有效。但是,如果它们在同一个频道上,并且您一次只需要 1 个消费者处理消息,我想只运行单个消费者是有意义的。另外,看看队列的exclusive 参数,在某些情况下它可能是一个解决方案。
  • @zaq178miami:我有点困惑,问题是,我有 2 个队列,每个队列上有多个消费者,我希望当消息到达队列 X 时 -> 只有一个活动消费者会接受消息,其他人会继续等待,当然直到下一条消息,然后是同样的故事
  • 顺便说一句,目前看来我也看到每个消费者都打开了新通道和新连接,我应该为每个队列使用相同的通道吗?如果我在不同的进程上多次运行消费者文件,我该怎么做?
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2012-05-24
相关资源
最近更新 更多