Короткий ответ
DLQ — отдельная очередь, куда сообщение перемещается после превышения числа неудачных попыток обработки, чтобы не блокировать обработку остальных сообщений и дать возможность разобрать проблемное сообщение отдельно.
Как это работает подробнее
Consumer при повторной ошибке обработки (после N попыток или определённого вида ошибки) явно отправляет сообщение в DLQ вместо бесконечного retry или потери; основная очередь продолжает обрабатывать следующие сообщения.
Пример кода
example.py
def callback(ch, method, properties, body):
try:
process(json.loads(body))
ch.basic_ack(delivery_tag=method.delivery_tag)
except PermanentError:
channel.basic_publish(exchange="", routing_key="orders.dlq", body=body)
ch.basic_ack(delivery_tag=method.delivery_tag)
except TransientError:
ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)Что использовать на практике
- Практика. Сообщения в DLQ должны сопровождаться метаданными об ошибке; дальше с DLQ работают через мониторинг (алерт при появлении новых сообщений), ручной разбор либо автоматический replay после исправления причины.
Подводные камни
- Риск. Не мониторить DLQ вообще — сообщения тихо скапливаются; отправлять в DLQ сообщения с временными ошибками без достаточного числа retry перед этим.