Я настроил маршрутизацию недоставленных сообщений с моей очередью, чтобы повторно ставить в очередь отклоненные сообщения с задержкой в несколько секунд, предотвращая временные ошибки потребителей, которые могут засорить очередь. Я настроил это так, чтобы и рабочая очередь, и очередь недоставленных сообщений были привязаны к одному и тому же обмену:
Создаваемые извне входящие сообщения направляются на обмен, который помещает их в рабочую очередь. Во время обработки сообщения потребитель может выйти из строя из-за некоторых временных ошибок (представьте, что поисковый робот получает ошибку 500 с веб-сайта).
Вместо того, чтобы отклонить сообщение и снова поместить его в начало очереди (что приведет к бесконечный цикл), мы маршрутизируем отклоненные сообщения (сrequeue=0
) на обмен, добавляя очередь недоставленных сообщений в качестве ключа маршрутизации. Здесь каждое сообщение получает TTL в X секунд, после чего оно будет отклонено и, следовательно, направлено обратно на обмен с ключом маршрутизации, установленным в исходную рабочую очередь.
Однако, глядя на литературу и примеры в Интернете, кажется, что все рекомендуют перенаправить на отдельный обмен недоставленными письмами:
Создаваемые извне входящие сообщения направляются на рабочий обмен, который помещает их в рабочую очередь. В случае сбоя потребителя сообщения отклоняются (с
requeue=0
) и перенаправляются на обмен недоставленными сообщениями. Обмен недоставленными сообщениями направляет сообщения в очередь недоставленных сообщений, где истекает срок жизни сообщения, а повторно отклоненные сообщения будут перенаправлены обратно в рабочий обмен.
Есть ли какие-то решающие преимущества у второй конструкции по сравнению с первой? Я не могу определить ни одного, но опять же, я не слишком уверен в RabbitMQ.