Реализация шаблона проектирования разделения ответственности за запросы команд (CQRS): подробное руководство

При разработке программного обеспечения шаблон проектирования Command Query Responsibility Segregation (CQRS) приобрел популярность благодаря своей способности улучшать масштабируемость и производительность в сложных приложениях. CQRS разделяет операции чтения и записи на отдельные модели, обеспечивая независимую масштабируемость и оптимизацию. В этой статье мы рассмотрим различные методы реализации CQRS, а также примеры кода, которые помогут вам понять и эффективно применять этот шаблон.

  1. Обработчики команд:
    В CQRS команды отвечают за изменение состояния системы. Обработчики команд получают команды и выполняют необходимую бизнес-логику. Вот пример обработчика команд на C#:
public class CreateOrderCommandHandler
{
    private readonly IOrderRepository _orderRepository;
    public CreateOrderCommandHandler(IOrderRepository orderRepository)
    {
        _orderRepository = orderRepository;
    }
    public void Handle(CreateOrderCommand command)
    {
        var order = new Order(command.OrderId, command.CustomerId, command.Products);
        _orderRepository.Save(order);
    }
}
  1. Обработчики запросов.
    Запросы извлекают данные из системы без изменения состояния. Обработчики запросов обрабатывают запросы и возвращают запрошенные данные. Вот пример обработчика запроса на Java:
public class GetCustomerOrdersQueryHandler {
    private final OrderRepository orderRepository;
    public GetCustomerOrdersQueryHandler(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    public List<Order> handle(GetCustomerOrdersQuery query) {
        return orderRepository.getOrdersByCustomerId(query.getCustomerId());
    }
}
  1. Обработчики событий.
    События используются для сообщения об изменениях, происходящих в системе. Обработчики событий реагируют на события и соответствующим образом обновляют модели чтения. Вот пример обработчика событий в Python, использующего шину событий:
class OrderCreatedEventHandler:
    def __init__(self, order_read_model):
        self.order_read_model = order_read_model
    def handle(self, event):
        self.order_read_model.create_order(event.order_id, event.customer_id, event.products)
  1. Модели команд и запросов.
    CQRS способствует использованию отдельных моделей для команд и запросов. Модели команд инкапсулируют данные, необходимые для изменения состояния системы, а модели запросов определяют структуры данных, используемые для получения информации. Вот пример командной модели в TypeScript:
class CreateProductCommand {
    constructor(public name: string, public price: number) {}
}
class GetProductQuery {
    constructor(public productId: string) {}
}

Шаблон проектирования разделения ответственности за запросы команд (CQRS) обеспечивает мощный подход к созданию масштабируемых и эффективных приложений. Разделяя операции чтения и записи, CQRS обеспечивает независимую оптимизацию и повышает общую производительность системы. В этой статье мы рассмотрели различные методы реализации CQRS, включая обработчики команд, обработчики запросов, обработчики событий и отдельные модели команд/запросов. Применяя CQRS, разработчики могут создавать надежные и масштабируемые системы, отвечающие требованиям современных приложений.