Dead-letter queue в n8n: runbook для failed items и replay ¶
Обновлено: 2026-05-29
Intent: runbook dead-letter queue pattern: failed items, replay, quarantine, manual review и защита от бесконечных retry в n8n
H1: Dead-letter queue в n8n: как хранить failed items и делать replay без дублей
Schema: TechArticle, HowTo, FAQPage, BreadcrumbList
Old word count: 661
New word count: 726
Короткий ответ ¶
В n8n dead-letter queue чаще реализуют как паттерн, а не как одну волшебную кнопку: failed item нужно сохранить в отдельный журнал с причиной, retry count, external ID и payload snapshot, а затем переигрывать отдельным replay workflow. Главное — не смешивать основной поток, бесконечные retry и ручной разбор. Если элемент падает несколько раз, он должен уходить в quarantine, а не снова атаковать API или создавать дубли.
Когда нужен DLQ-паттерн ¶
Dead-letter queue нужен, когда процесс нельзя просто “упасть и забыть”. Это особенно важно для:
- платежных уведомлений;
- CRM-лидов;
- заказов интернет-магазина;
- тикетов поддержки;
- email/SMS/Telegram рассылок;
- интеграций с нестабильным внешним API;
- AI/RAG-веток, где часть ответов требует ручной проверки.
Без DLQ failed items теряются в истории executions или переигрываются вручную из чата. Это плохо масштабируется и почти всегда приводит к дублям.
1. Что считать dead-letter ¶
Не каждая ошибка должна сразу уходить в DLQ. Разделите ошибки на временные и постоянные.
| Тип ошибки | Пример | Действие |
|---|---|---|
| Temporary | 429, 502, timeout | retry с backoff |
| Auth | 401, expired token | остановить поток, credential fix |
| Validation | нет email, неверный формат | DLQ/manual review |
| Conflict | объект уже существует | lookup/upsert, затем решить |
| Business rule | заказ отменён, статус не подходит | quarantine или skip с причиной |
| Unknown | непонятный 500 или bug | limited retry, затем DLQ |
Правило простое: если ошибка не исправится повторной попыткой или уже была несколько раз, item должен выйти из основного потока.
2. Минимальная структура DLQ ¶
DLQ может быть таблицей в Postgres, Google Sheets, Airtable, Supabase, внутренней CRM-таблицей или отдельным queue/storage. Главное — стабильная схема.
Минимальные поля:
id
created_at
workflow_name
execution_id
node_name
external_event_id
business_object_type
business_object_id
error_type
error_message
retry_count
payload_snapshot
status: new | retrying | resolved | skipped | escalated
owner
last_attempt_at
resolution_note
Не храните секреты, access tokens и лишние персональные данные в DLQ. Payload snapshot должен быть достаточным для replay, но не превращаться в незащищённый архив всех данных.
3. Как встроить DLQ в workflow ¶
Базовая архитектура:
- Main workflow получает событие.
- Проверяет
external_event_idна дубли. - Выполняет основную операцию.
- При временной ошибке делает limited retry.
- При постоянной ошибке пишет item в DLQ.
- Error workflow отправляет уведомление только при нужной severity.
- Replay workflow забирает items со статусом
newилиretrying.
Для node-level обработки используйте отдельную ветку ошибок или явную проверку результата. Важнее всего не потерять ID и контекст: без них replay становится угадыванием.
4. Replay workflow ¶
Replay должен быть отдельным workflow с ограничениями.
Правила replay:
- принимать список DLQ IDs, а не “всё подряд”;
- обрабатывать маленькими batch;
- перед повторной операцией делать status check;
- использовать idempotency key;
- увеличивать
retry_count; - менять status только после подтверждения;
- писать
resolution_note.
Плохой replay — снова отправить все failed payloads в production API без проверки. Хороший replay — понять текущее состояние объекта и выполнить только недостающую операцию.
5. Quarantine и manual review ¶
Если item три раза упал на одном и том же месте, он не должен бесконечно повторяться. Переведите его в escalated или manual_review.
Примеры quarantine-сценариев:
- клиентский email отсутствует, но CRM требует email;
- payment status у провайдера не совпадает с internal order status;
- AI output не прошёл JSON Schema;
- внешний API вернул conflict, но lookup не нашёл объект;
- webhook payload пришёл от неизвестного tenant.
Manual review должен иметь владельца и срок реакции. Иначе DLQ превращается в кладбище ошибок.
6. Метрики и алерты ¶
DLQ полезен только если за ним смотрят. Минимальные метрики:
- количество новых items;
- items старше 1 часа/1 дня;
- retry count > 3;
- top error types;
- top workflows by DLQ count;
- resolved/skipped ratio;
- среднее время до resolution.
Алерт нужен не на каждый failed item, а на рост очереди, S1/S2-процессы и items старше SLA.
FAQ ¶
Есть ли в n8n отдельная встроенная DLQ для всех workflow?
На практике для бизнес-процессов чаще проектируют собственный DLQ-паттерн: журнал failed items, replay workflow и правила quarantine.
Чем DLQ отличается от error workflow?
Error workflow уведомляет и помогает triage. DLQ хранит конкретные failed items для повторной обработки и ручного разбора.
Нужно ли хранить полный payload?
Только если это безопасно и необходимо. Лучше хранить ключевые ID, нормализованный payload и ссылку на защищённый источник.
Когда item можно считать resolved?
Только после проверки внешнего состояния: объект создан, статус обновлён, уведомление отправлено или бизнес-решение зафиксировано.
Как применять playbook в команде ¶
Playbook «Dead-letter queue в n8n» должен быть понятен человеку, который не писал workflow. Поэтому в нём нужны входной сигнал, частота запуска, критерий тревоги, ответственный и ожидаемое действие после срабатывания.
Используйте этот материал как операционную инструкцию: что проверить, где посмотреть логи, как понять масштаб проблемы и когда эскалировать.
| Слой | Что зафиксировать | Зачем |
|---|---|---|
| Вход | нормализованный prompt, контекст, список источников, версия промпта и ожидаемый JSON-ответ | позволяет повторить проблему без доступа к production-секретам |
| Контроль | validation_error_rate, token_cost, fallback_usage, human_review_rate, source_coverage | показывает деградацию раньше, чем пользователи начинают писать в поддержку |
| Безопасность | получить уверенный, но непроверенный ответ модели, сломанный JSON или дорогой цикл retry | снижает риск скрытых дублей, утечки данных и неконтролируемых write-действий |
| Готовность | есть тест на happy path, пустой вход, повтор и сбой внешнего сервиса для «Dead-letter queue в n8n» | делает статью пригодной для runbook, а не только для чтения |
Пример безопасного входного контракта ¶
{
"request_id": "req_demo_001",
"prompt_version": "2026-05-29",
"input": "краткое нормализованное сообщение пользователя",
"allowed_actions": ["read", "draft", "classify"],
"forbidden_actions": ["send_without_review", "change_payment"],
"expected_output": {
"intent": "technical|support|sales|unknown",
"confidence": 0.0,
"needs_human_review": true,
"sources": []
}
}
Критерий готовности ¶
- есть понятный вход, выход и владелец процесса
- проверены пустой input, повтор события и ошибка внешнего сервиса
- результат логируется без секретов и персональных данных
- страница связана с соседними рецептами, ошибками или playbook по теме