Сообщения RabbitMQ не отправляются на мертвую букву после первого раза

Наши очереди настроены для отправки сообщений о недоставленных сообщениях (в частности, сообщений с отсутствующими сообщениями) в обмен недоставленными сообщениями, который направляет их по их исходной теме в отдельные очереди недоставленных сообщений. Все это отлично работает, и когда сообщения не заполнены, они отправляются в правильную очередь недоставленных сообщений.

Проблема возникает, когда мы выгружаем эти сообщения обратно из dlq в обычную очередь, где они снова забиваются. По какой-то причине в этот второй раз они просто исчезают, а не отправляются обратно в обмен мертвыми письмами.

Я предполагаю, что происходит какое-то обнаружение круговой маршрутизации сообщений, но не могу найти ничего подобного. Проверка сообщений во второй раз дает все ожидаемые заголовки, поэтому я не уверен, на чем это вообще может быть основано. Мы будем очень благодарны за любые предложения о том, где искать дальше или есть ли у кролика такая вещь!

При необходимости наши потребители пишутся на python с использованием библиотеки pika для связи.


person Kenny Loveall    schedule 03.08.2020    source источник


Ответы (1)


Предполагая, что у вас есть следующие очереди / биржи:

Биржи

  • global_exchange - ваша основная биржа
  • DLX - еще один обмен специально для мертвых писем

Очереди

  • queue - ваша основная очередь в global_exchange. Содержит arguments=x-dead-letter-exchange: 'DLX'
  • queue.dlq - ваша очередь недоставленных сообщений в global_exchange

Привязки

  • test_message routing_key привязан к queue и queue.dlq

Наконец, я предполагаю, что вы используете плагин лопаты на queue.dlq странице управления, как это, для перемещения сообщений из queue.dlq в queue:

введите описание изображения здесь

Вот как работает маршрутизация, когда вы отправляете сообщение с test_message в качестве routing_key на global_exchange:

  1. Сообщение попадает в queue из привязки на test_message
  2. Сообщение потребителя nack (nack или reject не имеет значения), что делает его недействительным.
  3. Аргумент x-dead-letter-exchange отправляет его DLX с routing_key= test_message
  4. Из-за привязки queue.dlq эта очередь получает сообщение

Когда вы используете эту конкретную панель управления для возврата сообщений в queue, она использует обмен по умолчанию. Это изменяет ключ маршрутизации. Таким образом, второе получение сообщения имеет ключ маршрутизации, который совпадает с именем очереди, в которую вы загружаетесь.

Поскольку у вас не настроен x-dead-letter-routing-key, сообщение будет отправлено без букв в текущий ключ маршрутизации:

Если этот параметр не установлен, будут использоваться собственные ключи маршрутизации сообщения.

Итак, по результату лопаты, вот как она проложена:

  1. Сообщение появляется в queue с routing_key = queue
  2. Поскольку не настроен x-dead-letter-routing-key, он не отправляет письма на DLX с routing_key = queue
  3. Нет привязки к queue в DLX, сообщение сброшено

Есть 2 возможных обходных пути:

  1. Добавьте еще одну привязку к queue.dlq к routing_key = queue
  2. Вручную настройте x-dead-letter-routing-key на queue, чтобы он всегда отправлял один и тот же ключ маршрутизации в мертвом письме, независимо от того, какое сообщение было отправлено ему изначально, и убедитесь, что есть привязка к нему в DLX
person phillipuniverse    schedule 03.08.2020