✍️ В прошлом посте мы обсудили CDC и outbox pattern.
Напомню идею:
CDC (Change Data Capture) - механизм, который позволяет отследить изменения в базе данных и передать их в другую систему.
🎟 В нашем booking-примере:
➡️ Postgres - source of truth.
➡️ ElasticSearch - read model для быстрого поиска.
➡️ CDC - способ доставить изменения из Postgres в ElasticSearch.
🤎 Идея реализации CDC с помощью Transaction Log Tailing
База данных уже фиксирует все изменения в своём transaction log.
В Postgres такой лог называется Write-Ahead Log (WAL).
Когда мы меняем данные в таблице rooms, Postgres записывает это изменение в WAL.
⚠️ Например:
➡️ Обновили цену номера в таблице rooms.
➡️ Postgres записал изменение в WAL.
🫴 Далее мы хотим забирать такие изменения:
➡️ Специальный CDC-инструмент читает WAL.
➡️ Превращает изменение в событие.
➡️ Пересылает в ElasticSearch, Kafka или другую систему.
Получаем классическую схему в подобных System Design задачах:
Postgres -> WAL -> CDC Connector -> ElasticSearch
В этом подходе наше основное приложение не создаёт специальное событие(что оно делало в подходе с outbox).
🎖 Почему это удобно?
➡️ Нет изменений в коде приложения.
➡️ Можно отслеживать изменения автоматически.
Однако, не забываем и про минус такой реализации:
Transaction log хранит не бизнес-события, а технические изменения в базе.
У нас будет сухое описание:
➡️ не "RoomPriceChanged",
➡️ а "в таблице rooms у строки room_id = 42 изменилось поле price".
❓ Какие ещё заметили минусы?
И важный плюс по сравнению с outbox паттерном? 🐤
🔥 Итог:
Transaction log tailing - это способ реализации CDC, при котором мы автоматически читаем изменения напрямую из transaction log базы данных.
