TGViewer
Библиотека шарписта | C#, F#, .NET, ASP.NET Библиотека шарписта | C#, F#, .NET, ASP.NET @csharpproglib · 21.7K subscribers
Post #6719 3.14K
🛠 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_люминатор
  • ❤ 8
  • 👍 3
  • 🤔 3
More from @csharpproglib
  1. Sep 26, 2026📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #garbage_collector
  2. Sep 25, 2026🔐 NuGet: Microsoft меняет сертификат подписи С 23 сентября Microsoft использует новый сер…
  3. Sep 24, 2026🤩 Как поймать зависший .NET-сервис Приложение начинает тормозить, запросы зависают, а в л…
  4. Sep 23, 2026⚙️ yield return не бесплатный Итераторы выглядят просто, но работают иначе: IEnumerable<in…
  5. Sep 22, 2026💡 Replace, Regex или StringBuilder? Для замены текста в C# есть несколько инструментов. И…
  6. Sep 21, 2026⚙️ Настоящие атомарные операции Если Volatile решает проблему видимости, то Interlocked ре…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →