Определение происхождения сообщений rabbitmq - PullRequest
0 голосов
/ 06 сентября 2018

Я использую kombu для получения сообщений rabbitmq из нескольких очередей. Можно ли для любого данного сообщения определить, какая очередь его доставила?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Насколько я могу судить, не существует прямого способа получить доступ к имени очереди, в которой сообщение получено в комбу. Предлагаемое решение от Филиппа не является достаточно универсальным и, как ни странно, полагается на 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 просто включал ссылку на очередь, в которой было получено сообщение, вместе с сообщением, отправленным обратному вызову потребителя.

0 голосов
/ 06 сентября 2018

Можно (и просто) проводить различия на основе очереди, из которой отправлено сообщение, используя kombu. Вам просто нужно получить имя очереди через:

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

на стороне потребителя. Более подробное руководство по этому вопросу доступно по адресу https://adam.younglogic.com/2016/03/id-message-sender-kombu/

...