Skip to content
EN

Что такое CQRS

Коротко:

CQRS (Command Query Responsibility Segregation) — pattern, где read и write операции использую разные data models, часто разные databases. Write-side handles commands (create/update), read-side — queries. Применяется при high read-load (social feeds, analytics) или complex domain. Часто сочетается с Event Sourcing. Complexity overhead велик — не нужен для CRUD apps.

Ниже: подробности, пример, смежные термины, FAQ.

Проверить свой сайт →

Подробности

  • Command model: strong consistency, validation, business rules
  • Query model: denormalized, optimized for specific read patterns
  • Sync между ними — через events (eventual consistency)
  • Separate scaling: read side 10× replicas, write side stays small
  • Popular frameworks: MediatR (.NET), EventStore, Axon (Java)

Пример

// Command (write)
class CreateOrderCommand { orderId, customerId, items }
// Query (read)
class OrderSummaryView { orderId, total, status }  // denormalized

Смежные термины

Что такое CQRS?

CQRS (Command Query Responsibility Segregation) — это архитектурный шаблон, который разделяет операции чтения (query) и записи (command) данных. Это позволяет оптимизировать производительность, масштабируемость и безопасность приложения, так как разные модели данных могут использоваться для обработки команд и запросов. CQRS часто применяется в больших системах с высокой нагрузкой, где важно разделение бизнес-логики и упрощение управления данными.

Преимущества и недостатки CQRS

Использование CQRS имеет свои преимущества и недостатки. Рассмотрим их подробнее:

Преимущества:

  • Оптимизация производительности: Разделение чтения и записи позволяет использовать разные подходы для оптимизации каждого из этих процессов.
  • Масштабируемость: Возможность независимого масштабирования компонентов, отвечающих за команды и запросы.
  • Упрощение тестирования: Четкое разделение ответственности упрощает написание тестов.
  • Гибкость: Разные команды могут использовать различные технологии для обработки данных.

Недостатки:

  • Усложнение архитектуры: CQRS требует более сложной архитектуры и может быть излишним для небольших приложений.
  • Сложность в реализации: Необходимость синхронизации данных между командами и запросами может привести к дополнительным накладным расходам.
  • Необходимость в дополнительных инструментах: Часто требуется использование дополнительных инструментов для реализации CQRS.

Практический пример реализации CQRS

Рассмотрим пример реализации CQRS на языке программирования C#. В этом примере мы создадим простую систему управления заказами.

public class OrderCommand { public int Id { get; set; } public string Product { get; set; } public int Quantity { get; set; } }

Команда для создания заказа может выглядеть следующим образом:

public class CreateOrderCommandHandler { public void Handle(OrderCommand command) { // Логика создания заказа здесь }} 

Теперь создадим класс для обработки запросов:

public class OrderQueryHandler { public Order GetOrder(int id) { // Логика получения заказа здесь }} 

В этом примере мы четко разделили логику создания и получения заказов, что позволяет оптимизировать каждую из операций отдельно. CQRS также может быть использован в сочетании с Event Sourcing для сохранения истории изменений.

Больше по теме

Часто задаваемые вопросы

CQRS vs simple CRUD?

CRUD — один model для чтения и записи. CQRS — разделение, больше кода, но лучше для complex domains. Для simple apps — overkill.

Обязателен Event Sourcing?

Нет. CQRS работает и с обычной SQL. Но ES хорошо дополняет — write-side пишет events, read-side materializes views.

Как sync read model?

Async через events (Kafka, RabbitMQ). Eventual consistency — read model отстаёт на секунды-минуты.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.