识别rabbitmq消息的来源

问题描述 投票:0回答:2

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

python rabbitmq kombu
2个回答
0
投票

可以(并且简单)基于使用kombu发起消息的队列进行区分。您只需通过以下方式获取队列名称:

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

在消费者的最后。有关这方面的更深入的教程可在https://adam.younglogic.com/2016/03/id-message-sender-kombu/获得


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的话,那就更好了。

© www.soinside.com 2019 - 2024. All rights reserved.