Python 标识rabbitmq消息的来源

Python 标识rabbitmq消息的来源,python,rabbitmq,kombu,Python,Rabbitmq,Kombu,我正在使用kombu使用来自多个队列的rabbitmq消息。对于任何给定的消息,是否可以确定哪个队列传递了该消息?可以(而且很简单)使用kombu根据消息来源的队列进行区分。您只需通过以下方式获取队列名称: print message.properties.get('user_id','no user id in message') 在消费者方面。关于这方面的更深入的教程可以在上找到,据我所知,没有直接的方法可以访问kombu中接收消息的队列的名称。该函数不够通用,并且奇怪地依赖于发布调用中

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

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

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

在消费者方面。关于这方面的更深入的教程可以在

上找到,据我所知,没有直接的方法可以访问kombu中接收消息的队列的名称。该函数不够通用,并且奇怪地依赖于发布调用中指定的用户id。这带来了两个问题:

  • 并非每个制作人都可以将用户id信息与消息一起发送。在我们的测试用例中,默认情况下从未设置用户id。此外,使用user_id字段并不比简单地在消息本身中编码队列名称更有利
  • 在发布消息时使用路由键的好处是,从发布者的角度来看,我们不需要关心消息的去向。如果我们在已发布的消息中对队列名称进行编码(以任何方式,用户id或其他方式),那么它就无法达到路由的目的
在使用ConsumerMixin时,我们确定了两种可能的解决方案:

  • 在消费者对象上设置kombu consumer_标记字段,然后定义仅在单个队列上消费的消费者。如果需要侦听多个队列,请定义多个使用者。此属性不太理想,因为它没有文档记录,并且涉及字符串匹配,因为字段附加了一个整数
  • 使用Python分部函数包装使用者回调函数并传递队列名称:

    con = Consumer(queue=queue, callback=[partial(self.callback, queue_name=queue.name)])
    ...
    def callback(self, body, message, queue_name):
    
这两种解决方案都不是特别优雅。如果kombu只包含一个对队列的引用,在该队列上接收消息并将消息发送给消费者回调,则更好