【问题标题】:Delivering messages only once in RabbitMQ headers exchange在 RabbitMQ 标头交换中仅传递一次消息
【发布时间】:2015-11-17 13:18:53
【问题描述】:

我正在尝试使用 RabbitMQ 实现任务分配系统。我从本文中的代码开始:http://deontologician.tumblr.com/post/19741542377/using-pika-to-create-headers-exchanges-with - 有一个标头交换,并且多个消费者的队列使用不同的标头值绑定到它。

每条消息(任务)都有一个标头“env”,它指定了运行任务的环境。将来可能需要根据更多标头做出决策。消费者可以提供多个环境,因此我将他的队列绑定到标题交换多次不同的标题值。

这样,我可以设置两个消费者 A 和 B。A 提供环境“foo”和“bar”,B 仅提供“bar”。现在,当需要环境“bar”的任务时,它会同时交付给 A 和 B,但我只希望它去其中一个(实际上并不重要)。

似乎当发布与多个消费者的标头匹配的消息时,它会传递给所有消费者。但是,我需要将每条消息准确地传递给一个具有匹配标头的消费者。有没有办法实现这一目标?

【问题讨论】:

  • 您能否举例说明标头值可能如何变化以及您需要如何将消息发送给不同的消费者?
  • @kponz 我把问题扩大了一点......
  • 您可以考虑设置队列以匹配您的环境,即创建一个foo 和一个bar 队列,然后将您的消费者绑定到他们感兴趣的队列(A 绑定到两者, B只给bar)

标签: rabbitmq message-queue pika


【解决方案1】:

例如,我可以设置两个消费者 A 和 B。A 提供环境“foo”和“bar”,而 B 仅提供“bar”。现在,当需要环境“bar”的任务时,它会同时交付给 A 和 B,但我只希望它去其中一个(实际上并不重要)。

使用您当前的设置,您想要的将无法实现。所有路由匹配都会收到消息的副本。

但是,您可以做的是更改您的配置,使您拥有一个“foo”队列和一个“bar”队列。然后,您可以在“foo”队列上有多个消费者,在“bar”队列上有多个消费者。

在这种情况下,当一条消息被放入“foo”并且消费者 A 和消费者 B 都在监听时,RabbitMQ 将只将一条消息传递给其中一个消费者。

...

请记住,不可能 100% 保证一条消息只会被处理一次。网络或消费者代码中的任何错误都可能导致消息返回到队列并再次处理。正因为如此,您的消息/消费者需要使用idempotence 以确保处理同一条消息两次不会造成问题。

【讨论】:

  • 是的,我不介意在特殊情况下是否会发送两次消息。我只是不希望它被交付给每个消费者(或迷路)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2015-10-02
相关资源
最近更新 更多