在 RabbitMQ headers 交换中仅传递一次消息

Delivering messages only once in RabbitMQ headers exchange

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

每条消息(任务)都有一个 header "env" 指定一个 运行 任务所在的环境。可能需要根据更多 header 在未来。消费者可以提供多个环境,所以我将他的 queue 绑定到 headers exchange 多次使用不同的 header 值。

这样,我可以设置两个消费者 A 和 B。A 提供环境 "foo" 和 "bar",而 B 仅提供 "bar"。现在当一个任务需要环境 "bar" 时,它同时被传递给 A 和 B,但我只希望它传递给其中一个(哪个并不重要)。

似乎当发布的消息与多个消费者的 header 匹配时,它会传递给所有消费者。但是,我需要将每条消息传递给匹配 header 的消费者。有什么办法可以做到这一点?

I can set up for example two consumers A an B. A provides environments "foo" and "bar" and B provides only "bar". Now when a task that requires environment "bar", it is delivered to both A and B, but I only want it to go to one of them (it doesn't really matter which one).

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

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

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

...

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