RabbitMQ, как удалить сообщение после n попытки повторной постановки в очередь

Я пытаюсь создать своего рода асинхронный сервер, используя RabbitMQ вместе с JAVA. У меня две биржи Original_Exch и Dead_Exch, и в каждой по одной очереди. Оба обмена объявлены DLX (обмен недоставленными сообщениями очереди друг друга).

Теперь перейдем к проблеме: я публикую сообщение в Original_Exch в виде строки json, которая содержит информацию об электронной почте (например, «Кому», «Тема», «Тело сообщения», «вложение» и т. д.). После использования этого сообщения из очереди, привязанной к Original_exch, я отправляю электронное письмо на указанный адрес электронной почты. В случае, если электронная почта не отправляется успешно, я передаю это сообщение в Dead_Exch, и через 2 секунды (используя для этого TTL) сообщение снова передается в Original_Exch.

Предположим сценарий, в котором конкретное сообщение перемещается с одного сервера на другой из-за постоянных сбоев. В этом случае я хочу убедиться, что если он был передан в Original_Exch 10 раз, он должен быть удален (удален) из очереди навсегда и не должен быть передан в Dead_Exch.

Есть так много ответов на почти похожие вопросы, но ни один из них не является удовлетворительным (с точки зрения учащегося).

Спасибо..........


person Haridesh Yadav    schedule 30.03.2016    source источник


Ответы (1)


Сообщения с недоставленными письмами имеют заголовок x-death с подробной информацией о том, через какие очереди они прошли и сколько раз. См. статью об обмене недоставленными письмами на веб-сайте RabbitMQ.

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

  • В вашем потребителе, когда письмо не может быть доставлено, посмотрите на заголовок x-death и решите, хотите ли вы отправить его недоставленным (Basic.Nack с requeue, установленным в false) или удалить его (Basic.Ack).
  • Используйте тип обмена заголовком для Dead_Exch и настройте привязку для соответствия x-death.

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

person Jean-Sébastien Pédron    schedule 30.03.2016