Подтвердить что ты не робот

Обмен мертвой буквой RabbitMQ, никогда не получающий сообщений

Я пытаюсь настроить свой первый обмен мертвыми письмами RabbitMQ, вот шаги, которые я использую через интерфейс веб-администратора:

  • Создайте новый DIRECT-обмен с именем "dead.letter.test"
  • Создать новую очередь "dead.letter.queue"
  • Привязать "dead.letter.queue" к "dead.letter.test"
  • Создать новую очередь "test1" с заменой мертвой буквы на "dead.letter.test"
  • Отправить сообщение в "test1"
  • Nack (с запросом = false) сообщение в "test1"

Я ожидаю, что эти шаги должны поместить запись в "dead.letter.queue" через обмен "dead.letter.test" . Этого не происходит.

Я могу вручную отправить сообщение в обмен "dead.letter.test" , и он появляется в "dead.letter.queue", поэтому я знаю, что это нормально.

Когда я смотрю на интерфейс администратора, он показывает, что параметр DLX настроен в очереди "test1".

Где я иду не так?

4b9b3361

Ответ 1

Gentilissimo Signore был достаточно любезен, чтобы ответить на мой вопрос в Twitter. Проблема в том, что если ваш обмен мертвой буквой настроен как DIRECT, вы должны указать ключ маршрутизации мертвой буквы. Если вы просто хотите, чтобы все ваши сообщения NACKed вошли в ведро мертвой буквы для последующего расследования (как и я), ваш обмен мертвой буквой должен быть настроен как FANOUT.

Ниже приведены обновленные шаги, которые работают:

  • Создайте новый FANOUT обмен с именем "dead.letter.test"
  • Создать новую очередь "dead.letter.queue"
  • Привязать "dead.letter.queue" к "dead.letter.test"
  • Создать новую очередь "test1" с заменой мертвой буквы на "dead.letter.test"
  • Отправить сообщение в "test1"
  • Nack (с запросом = false) сообщение в "test1"

Ответ 2

Мертвая буква Exchange без ключа маршрутизации и с прямым обменом


Следуйте инструкциям, которые будут работать точно: -
 1. Создайте новую очередь с именем " dead_queue".
 2. Создайте обмен с именем " dead_exchange" , и тип обмена должен быть "прямым".
 3. Свяжите " dead_queue" и " dead_exchange" без ключа маршрутизации.
 4. Создайте новую очередь с именем " test_queue" и установите ее " x-dead-letter-exchange" как " dead_exchange"
 5. Создайте обмен с именем " test_exchange", и тип обмена должен быть "прямым"
 6. Свяжите " test_exchange" и " test_queue" без ключа маршрутизации.

И наконец мы это проверим. Для этого опубликуйте что-то на test_exchange 'с аргументом expiration ", установленным на 10000. После этого, когда сообщение публикуется в' test_exchange ', перейдет в " test_queue", и когда сообщение будет истекло в очереди, он будет искать DLX-параметр (имя мертвой буквы) там, где это сообщение найдет имя " dead_exchange ', то это сообщение достигнет' dead_exchange 'доставить его в мертвую очередь'.. Если все еще есть какие-то проблемы в этом отношении, и если я пропущу, поняла вашу проблему... напишите вашу проблему, я обязательно просмотрю ее... Спасибо..

Примечание. Должно публиковать сообщение на test_exchange ", потому что привязка test_queue и test_exchange не имеет ключа маршрутизации, и она будет работать нормально, но если вы опубликуете сообщение на ' b > test_queue". По истечении очереди сообщений пытается доставить это мертвое сообщение на dead_exchange с помощью некоторого ключа маршрутизации по умолчанию, и сообщение не будет отправлено в эту очередь.

Ответ 3

Если вы хотите использовать пользовательский ключ маршрутизации при обмене мертвой буквой, вы должны установить x-dead-letter-routing-key при объявлении рабочей очереди (в вашем случае это test1), в противном случае будет использоваться ключ маршрутизации по умолчанию. В вашем случае брокер RabbitMQ обнаруживает цикличность и просто отбрасывает отклоненные сообщения.

Вам нужно иметь аргументы x-dead-letter-exchange=dead.letter.test и x-dead-letter-routing-key=dead.letter.queue, установленные в очереди test1.

Ответ 4

Создайте новый DIRECT-обмен с именем "dead.letter.test"

Правильный

Создать новую очередь "dead.letter.queue"

Правильный

Привязать "dead.letter.queue" к "dead.letter.test"

Правильный

Создать новую очередь "test1" с заменой мертвой буквы на "dead.letter.test"

Я предполагаю, что вы создаете очередь test1 и привязываете ее к файлу dead.letter.test

Отправить сообщение в "test1"

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

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

Если вы публикуете сообщение на direct.letter.test exchange, тогда вся очередь получит сообщение. Он будет работать как обмен разветвления

Итак, если вы хотите, чтобы dead.letter.queue получал сообщение, вам придется публиковать сообщение в этой очереди или вам придется использовать тот же ключ маршрутизации при публикации и подписке и публикации сообщения для обмена

Ответ 5

Если вы хотите, чтобы все ваши очереди имели одинаковый обмен мертвой буквой, проще установить общую политику:

sudo rabbitmqctl -p /my/vhost/path set_policy DLX ".*" '{"dead-letter-exchange":"MyExchange.DEAD"}' --apply-to queues