
Две базы: одна пишет, другая читает. CQRS без культа и с последствиями
pabel0071 29 минут назад Две базы: одна пишет, другая читает. CQRS без культа и с последствиями Простой 5 мин 535 .NET * ASP * C# * Кейс Привет, Хабр! Меня зовут Павел, я ведущий разработчик. После статьи про Kafka...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Значимый прорыв формирует отрасль ИИ: pabel0071 29 минут назад Две базы: одна пишет, другая читает. CQRS без культа и с последствиями Простой 5 мин 535 . NET * ASP * C# * Кейс Привет, Хабр!
Меня зовут Павел, я ведущий разработчик. После статьи про Kafka хочется продолжить тему продовых интеграций, но без попытки написать архитектурную энциклопедию на 40 минут чтения. Сегодня про схему, которая на диаграмме выглядит очень спокойно:Write DB -> Outbox -> Kafka -> Consumer -> Read DB Одна база принимает изменения.
Технические детали
Другая отвечает на чтение. В проде — lag, backfill, дубли, версии событий и вопрос от бизнеса: “Почему я нажал сохранить, а в отчете еще старое? ”Две базы: одна пишет, другая читаетЗачем вообще разделять чтение и записьОбычно все начинается с одной базы.
Одна база часто живет долго и счастливо, пока ее не начинают одновременно просить:быстро принимать изменения;держать транзакции и бизнес-инварианты;строить тяжелые отчеты;отдавать списки с фильтрами;делать поиск по полям, которые вчера “точно не понадобятся”;не грустить под нагрузкой. Если проблема только в том, что чтение давит на primary, иногда достаточно read replica. Это более простой путь.
Но replica повторяет структуру write-базы. Если для чтения нужна другая форма данных — денормализованная, предрассчитанная, заточенная под экран, поиск или отчет — появляется смысл в отдельной read model. Коротко:ПодходКогда подходитRead replicaНужно разгрузить чтение, схема данных та жеRead modelНужно другое представление данных под запросыОтдельная read DBНужен другой движок: ClickHouse, Elastic, Mongo, отдельный PostgresВажно: CQRS не обязан означать две физические базы.
Отраслевые последствия
Но в этой статье говорим именно про вариант, где write model и read model живут в разных хранилищах. Как это обычно выглядитWrite DB, Outbox, Kafka и Read DBПоток записи:Command API принимает команду. В write DB меняется бизнес-сущность.
В той же транзакции пишется запись в outbox. Outbox relay публикует событие в Kafka. Consumer читает событие.
Consumer обновляет read DB. Query API читает из read DB. Почему outbox пишется в той же транзакции, что и бизнес-изменение?
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





