Сообщение не направляется в очередь недоставленных сообщений, когда потребитель не работает - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть служба A, которая публикует сообщение в очереди (QA).У меня есть очередь недоставленных сообщений (DLQ), связанная с DLX с помощью DLRK.Очередь А ограничена обменом (EA) с помощью ключа маршрутизации (RA).Я также установил x-letter-exchange (DLX) и x-dead-letter-routing-key (DLRK) на QA с ttl-per-message в этой очереди равным 60 секундам. DLQ также установлен с помощью x-letter-exchange (EA) и x-dead-letter-routing-key (DLRK) с ttl-per-message в этой очереди до 60 секунд.

При указанной выше конфигурации я пытаюсь перенаправить сообщение в DLQ изQA после истечения ttl и наоборот.На стороне потребителя, которая является другой службой, я выбрасываю исключение AMQPRejectAndDontRequeueException со значением defaultRequeueRejected, равным fals.

Приведенная выше конфигурация работает нормально, когда потребитель работает, и выдает исключение
.Но я пытаюсь ограничить размер своей очереди до 1, а затем опубликовать 3 сообщения в QA, а также отключить потребителя.Я вижу все три сообщения, помещенные как в QA, так и в DLQ, и в конце концов все сообщения отбрасываются.Но если я не установлю предел очереди в 1 или не запустлю потребителя, все будет работать нормально.

Я также установил x-overflow для reject-publish, и когда есть переполнение, я получаю nackу издателя, а затем у меня есть планировщик, который публикует его снова в QA.

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

Пожалуйста, дайте мне знать, если я что-то упустил здесь, и дайте мне знать, нужно поделиться моей конфигурации

1 Ответ

0 голосов
/ 30 ноября 2018

Пролистав, думаю, я наконец-то нашел ответ по ссылке Мертвые буквы в сообщениях RabbitMQ ответ от pinepain

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...