💻 System Design: что такое CDC
В прошлом посте мы разобрали CQRS на примере booking-сервиса.
У нас была схема:
🫰 Админ обновляет данные номера в Postgres.
🔍 Пользователь ищет номера через ElasticSearch.
Между ними есть важная часть:
Postgres -> CDC -> ElasticSearch
CDC - Change Data Capture.
Перевожу для себя так - Захват Изменяющихся Данных
Если просто - CDC позволяет отследить изменения в базе данных и передать их дальше в другую систему.
CDC отвечает на вопрос:
«Как изменения из source of truth доезжают до read model?»
В нашем примере:
Postgres - source of truth.
ElasticSearch - read model для быстрого поиска.
CDC - механизм доставки изменений между ними.
❓ Как реализовать эту концепцию?
Один из способов реализовать CDC - outbox pattern.
Идея:
Когда сервис обновляет данные в Postgres, он в той же транзакции записывает событие в отдельную таблицу, называемую outbox.
Например:
➡️ Обновили цену номера в таблице rooms.
➡️ В этой же транзакции записали событие room_price_updated в таблицу outbox_events.
➡️ Отдельный worker читает outbox_events.
➡️ Worker отправляет изменение дальше.
Почему это удобно?
➡️ Потому что изменение данных и запись события происходят атомарно.
Мы избежим ситуации, когда:
➡️ Данные в Postgres обновились.
➡️ А событие для ElasticSearch потерялось.
👍 Плюсы outbox pattern:
🤎 Надёжность: данные и событие записываются в одной транзакции.
🤎 Можно контролировать формат события.
🤎 Хорошо подходит для бизнес-событий: RoomUpdated, PriceChanged, BookingCreated.
🤎 Можно добавить retry, статус обработки и dead letter queue.
Минусы:
Давайте опишем в комментариях 👍
Итог:
CDC - это способ доставить изменения из source of truth в другие системы.
А outbox pattern - это один из практичных способов сделать такую доставку надёжнее.
Цена - больше инфраструктурной логики и больше ответственности за обработку событий.
Больше про паттерн:
🔘50 оттенков Transactional Outbox - Денис Цветцих
🔘Transaction Outbox под нагрузкой: как не потерять ни одного события при 100k+ RPS - Олег Мифле
🔘Outbox pattern для System Design Интервью - моя статья
Post #665
2.2K


- 🔥 7
- ❤ 3
- 👍 2