Ответ
CQRS (Command Query Responsibility Segregation) — это архитектурный шаблон, разделяющий модель данных для операций записи (Commands) и чтения (Queries).
Ключевые принципы:
- Команда (Command) — операция, изменяющая состояние системы (например,
CreateOrder,UpdateUserEmail). Не возвращает данные, кроме подтверждения. - Запрос (Query) — операция, возвращающая данные без изменения состояния (например,
GetOrderDetails,FindUsersByRole).
Типичная реализация:
// Модель для записи (Command Model) — содержит бизнес-логику
public class Order {
private UUID id;
private List<OrderItem> items;
private OrderStatus status;
public void cancel() {
if (status == OrderStatus.SHIPPED) {
throw new IllegalStateException("Cannot cancel shipped order");
}
this.status = OrderStatus.CANCELLED;
}
}
// Модель для чтения (Query Model) — оптимизирована под отображение
public class OrderView {
private UUID id;
private String customerName;
private BigDecimal totalAmount;
private String statusLabel;
// Денормализованные данные для быстрого чтения
}
Преимущества:
- Масштабируемость — чтение и запись можно масштабировать независимо
- Гибкость — разные модели оптимизированы под свои задачи
- Безопасность — разделение прав доступа на уровне модели
- Производительность — чтение из оптимизированных представлений
Недостатки:
- Сложность — две модели вместо одной
- Согласованность — eventual consistency между моделями
- Over-engineering — не нужен в простых CRUD-приложениях
Когда использовать:
- Высокая нагрузка на чтение (социальные сети, каталоги)
- Сложная бизнес-логика в командах (банковские системы)
- Разные требования к данным для UI и бизнес-логики
Связанные паттерны: Event Sourcing (часто используется вместе), Materialized Views.