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