Разработчики часто полагаются на retry как на панацею, но битые задачи могут висеть вечно, теряя данные и забивая воркеры. Dead Letter Queue перехватывает их после исчерпания попыток, гарантируя сохранность и контроль — именно это нужно в production-системах с высокими требованиями к надежности.
Проблема: retry без выхода
Стандартные retry в Celery без DLQ приводят к двум сценариям: задача либо уходит в бесконечный цикл, либо просто теряется после max_retries. Это недопустимо при обработке заказов, платежей или критических данных.
Решение: маршрутизация в DLQ с автоматической отправкой
Сначала настрой routing: укажи, куда отправлять failed-задачи после последней retry. Внутри обработчика
my_task при исчерпании retries вызывай отдельную задачу-заглушку в очереди dead_letter. Это контейнер для анализа:app = Celery('tasks', broker='redis://localhost')
app.conf.task_routes = {
'my_task': {'queue': 'default'},
'my_task.dead_letter': {'queue': 'dead_letter'},
}
@app.task(bind=True, max_retries=3, default_retry_delay=30)
def my_task(self, data):
try:
process_data(data)
except Exception as exc:
if self.request.retries < self.max_retries:
raise self.retry(exc=exc)
else:
app.send_task('my_task.dead_letter', args=[data, str(exc), self.request.id])
@app.task(queue='dead_letter')
def my_task_dead_letter(data, error, task_id):
logger.error(f'Task {task_id} failed with {error}')
archive_failed_task(data, error)Преимущества
* Zero data loss — данные не пропадают, а попадают в DLQ для анализа.
* Контроль — ты решаешь: повторить вручную, исправить багу или удалить.
* Стабильность ресурсов — бесконечные retry перестают жрать воркеры.
Типичная ошибка
Многие забывают настраивать routing для dead_letter и отправляют данные в общую очередь, что забивает воркеры мусором или приводит к повторным бесконечным retry.
Совет
Выдели отдельный worker для DLQ с низким приоритетом — не грузи критичные воркеры обработкой битых задач.
Вывод:
Dead Letter Queue — это не опция, а обязательный паттерн для production-систем на Celery, который превращает разрозненные retry в управляемый конвейер с гарантией сохранности данных.