识别Rabbitmq消息的来源

时间:2018-09-06 01:35:28

标签: python rabbitmq kombu

我正在使用kombu消耗来自多个队列的Rabbitmq消息。对于任何给定的消息,是否可以确定哪个队列传递了它?

2 个答案:

答案 0 :(得分:0)

有可能(而且很简单)根据使用kombu发出消息的队列进行区分。您只需要通过以下方法获取队列名称:

 print message.properties.get('user_id','no user id in message')

在消费者端。在https://adam.younglogic.com/2016/03/id-message-sender-kombu/

上可以找到更详细的教程。

答案 1 :(得分:0)

据我所知,没有直接方法可以访问在kombu中接收到消息的队列的名称。 proposed solution by Philip的通用性不够,奇怪地依赖于在发布调用中指定的user_id。这带来了两个问题:

  • 并非每个生产者都可以将user_id信息与消息一起发送。在我们的测试案例中,默认情况下从未设置过user_id。此外,使用user_id字段比仅在消息本身中对队列名称进行编码没有任何好处。
  • 在发布消息时使用路由键的好处是,从发布者的角度来看,我们不需要关心消息的去向。如果我们在已发布消息中对队列名称(以任何方式,无论是user_id还是其他方式)进行编码,那么就无法实现路由的目的。

在使用ConsumerMixin时,我们确定了两种可能的解决方案:

  • 在Consumer对象上设置kombu Consumer_tag字段,然后将Consumers定义为仅在单个队列中消费。如果您需要侦听多个队列,请定义多个使用者。此属性之所以不理想,是因为它没有记录,并且涉及字符串匹配,因为该字段后面附加了整数。
  • 使用Python部分函数包装Consumer回调函数并传递队列名称:

    con = Consumer(queue=queue, callback=[partial(self.callback, queue_name=queue.name)])
    ...
    def callback(self, body, message, queue_name):
    

这些解决方案都不是特别优雅。更好的情况是,如果kombu仅包含对收到消息的队列的引用以及发送给Consumer回调的Message。