我正在尝试使用RabbitMQ实现任务分发系统。我从这篇文章的代码开始:http://deontologician.tumblr.com/post/19741542377/using-pika-to-create-headers-exchanges-with - 有一个标题交换和多个消费者'队列绑定到不同的标头值。
每条消息(任务)都有一个标题" env"指定运行任务的环境。可能有必要在将来根据更多标头做出决策。消费者可以提供多个环境,因此我将其队列绑定到具有不同标头值的多次交换头。
这样,我可以设置例如两个消费者A和B.A提供环境&#34; foo&#34;和&#34; bar&#34;和B仅提供&#34; bar&#34;。现在当一个需要环境的任务&#34; bar&#34;时,它被传递到A和B,但我只想让它去其中一个(它真的不重要)。< / p>
似乎当发布的消息与多个消费者的标题相匹配时,它会传递给所有消费者。但是,我需要将每条消息传递给具有匹配标头的一个消费者。有没有办法实现这个目标?
答案 0 :(得分:1)
我可以设置例如两个消费者A和B.A提供环境“foo”和“bar”而B仅提供“bar”。现在当一个需要环境“bar”的任务时,它被传递给A和B,但我只想让它去其中一个(这对哪一个并不重要)。
使用您当前的设置,您想要的是不可能的。所有路由匹配都将收到该消息的副本。
但是,你可以做的是改变你的配置,你有一个“foo”队列和一个“bar”队列。那么,你可以在“foo”队列上拥有多个使用者,在“bar”队列中拥有多个使用者。在这种情况下,当单个消息被放入“foo”并且消费者A和消费者B都在监听时,RabbitMQ将仅向其中一个消费者传递单个消息。
...
请注意,不可能100%保证单个邮件只能处理一次。网络或消费者代码中的任何错误都可能导致消息返回到队列并再次处理。因此,您的消息/消费者需要使用idempotence来确保两次处理相同的消息不会导致问题。