【问题标题】:Identifying origin of rabbitmq messages识别rabbitmq消息的来源
【发布时间】:2018-09-06 01:35:27
【问题描述】:

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

【问题讨论】:

    标签: python rabbitmq kombu


    【解决方案1】:

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

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

    在消费者端。 https://adam.younglogic.com/2016/03/id-message-sender-kombu/ 上提供了更深入的教程

    【讨论】:

      【解决方案2】:

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

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

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

      • 在 Consumer 对象上设置 kombu consumer_tag 字段,然后将 Consumers 定义为仅在单个队列上消费。如果需要监听多个队列,定义多个 Consumer。此属性不太理想,因为它没有记录并且涉及字符串匹配,因为该字段附加了一个整数。
      • 使用Python偏函数包装Consumer回调函数并传递队列名:

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

      这些解决方案都不是特别优雅。如果 kombu 只包含对接收消息的队列的引用以及发送到消费者回调的消息,那会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多