我正在使用kombu来使用来自多个队列的rabbitmq消息。 对于任何给定的消息,是否可以确定哪个队列传递了它?
可以使用kombu
根据消息源自的队列进行区分。您只需通过以下方式获取队列名称:
print message.properties.get('user_id','no user id in message')
在消费者端。有关此内容的更深入教程,请访问 https://adam.younglogic.com/2016/03/id-message-sender-kombu/
据我所知,没有直接的方法可以访问在 kombu 中接收消息的队列的名称。Philip 提出的解决方案不够通用,奇怪的是依赖于发布调用中指定的user_id。这带来了两个问题:
- 并非每个生产者都可以将user_id信息与消息一起发送。在我们的测试用例中,默认情况下从未设置user_id。此外,使用 user_id 字段并不比简单地在消息本身中对队列名称进行编码更有利。 在发布消息
- 时使用路由密钥的好处是,从发布者的角度来看,我们不需要关心消息的去向。如果我们在发布的消息中对队列名称(以任何方式、user_id或其他方式(进行编码,那么它就违背了路由的目的。
在使用ConsumerMixin时,我们确定了两种可能的解决方案:
- 在消费者对象上设置 kombu consumer_tag字段,然后定义消费者仅在单个队列上使用。如果需要侦听多个队列,请定义多个使用者。此属性不太理想,因为它没有记录并且涉及字符串匹配,因为字段附加了一个整数。
-
使用 Python 分部函数包装 Consumer 回调函数并传递队列名称:
con = Consumer(queue=queue, callback=[partial(self.callback, queue_name=queue.name)]) ... def callback(self, body, message, queue_name):
这些解决方案都不是特别优雅。如果 kombu 只包含对接收消息的队列的引用以及发送到消费者回调的消息,那就更好了。