🛠 PostgreSQL как Dead Letter Queue
История о том, как в Wayfair отказались от Kafka DLQ в пользу PostgreSQL и получили более управляемую систему обработки сбоев.
Проблема: события падают, а видимости нет
Сбои встречались везде: API для обогащения данных падали или тормозили, консьюмеры крашились посреди обработки, события приходили с битыми или отсутствующими полями. Всё это находилось вне прямого контроля команды, но требовало изящной обработки.
Первая попытка: Kafka как DLQ
Логичным решением было использовать сам Kafka в качестве Dead Letter Queue. Общий паттерн: если событие не обработалось, отправляем его в отдельный топик DLQ.
Но быстро стало ясно, что это не лучший вариант. Kafka отлично двигает данные, но когда сообщения попадают в DLQ-топик, с ними сложно работать:
• Нельзя просто взять и выполнить запрос «покажи всё, что упало вчера»
• Нет нормальной фильтрации по причине сбоя
• Чтобы повторить обработку конкретного набора событий, нужны кастомные консьюмеры
• Для любого анализа требуется дополнительный инструментарий
Для системы, генерирующей критичные бизнес-отчёты, такое отсутствие видимости стало серьёзной проблемой.
Решение: PostgreSQL как первоклассный DLQ
Вместо публикации сбойных событий в топик Kafka, начали сохранять их прямо в таблицу DLQ в PostgreSQL. CloudSQL уже использовался как основное хранилище, так что операционно это почти ничего не добавило. Концептуально же сбои стали первоклассными гражданами системы, а не непрозрачными сообщениями, потерянными в потоке.
Дизайн-решения
• payload как JSONB — сохраняет сырое событие без жёсткой схемы. Можно хранить любую структуру и при этом эффективно запрашивать.
• Простая модель состояний — только PENDING и SUCCEEDED. Минимализм делает жизненный цикл события понятным.
• retry_after — предотвращает агрессивные повторы, когда зависимые системы нестабильны.
• retry_count — позволяет ограничивать количество попыток без внешнего состояния. Если событие не обработалось за 240 попыток — возможно, с ним что-то фундаментально не так.
• Временные метки — делают аудит и операционный анализ простым делом.
Целью не было заменить Kafka на PostgreSQL. Kafka остался основой для высокопроизводительного приёма событий, а PostgreSQL взял на себя то, что умеет лучше всего — долговременность, запросы и наблюдаемость вокруг сбоев.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор
Post #6719
3.14K

- ❤ 8
- 👍 3
- 🤔 3