Для retry нужны устойчивое хранение, задержка, подтверждение новой публикации и идемпотентная обработка. Обычная связка TTL и DLX сама по себе не гарантирует отсутствие потерь.
Как реализовывал отложенные повторные попытки (retry) в RabbitMQ без потери сообщений?
Для retry нужны устойчивое хранение, задержка, подтверждение новой публикации и идемпотентная обработка. Обычная связка TTL и DLX сама по себе не гарантирует отсутствие потерь.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Для retry нужны устойчивое хранение, задержка, подтверждение новой публикации и идемпотентная обработка. Обычная связка TTL и DLX сама по себе не гарантирует отсутствие потерь.
Сообщение можно направить в retry-очередь с TTL и возвратом через DLX. Но по умолчанию dead-letter перепубликация может потерять сообщение при недоступности назначения. Для соответствующих quorum queues существует настраиваемый режим at-least-once dead-lettering.
При прикладной перепубликации дождитесь publisher confirm и проверьте маршрутизацию до подтверждения исходного сообщения; возможные дубли должен выдерживать consumer. Ограничьте попытки, разделяйте временные и постоянные ошибки, используйте DLQ и наблюдаемость. Повтор с requeue без задержки создаёт горячий цикл.
Источник: www.rabbitmq.com, www.rabbitmq.com.