Что такое шаблон CQRS в архитектуре приложений?

«Что такое шаблон CQRS в архитектуре приложений?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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-приложениях

Когда использовать:

  1. Высокая нагрузка на чтение (социальные сети, каталоги)
  2. Сложная бизнес-логика в командах (банковские системы)
  3. Разные требования к данным для UI и бизнес-логики

Связанные паттерны: Event Sourcing (часто используется вместе), Materialized Views.