При разработке программного обеспечения шаблон проектирования Command Query Responsibility Segregation (CQRS) приобрел популярность благодаря своей способности улучшать масштабируемость и производительность в сложных приложениях. CQRS разделяет операции чтения и записи на отдельные модели, обеспечивая независимую масштабируемость и оптимизацию. В этой статье мы рассмотрим различные методы реализации CQRS, а также примеры кода, которые помогут вам понять и эффективно применять этот шаблон.
- Обработчики команд:
В 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);
}
}
- Обработчики запросов.
Запросы извлекают данные из системы без изменения состояния. Обработчики запросов обрабатывают запросы и возвращают запрошенные данные. Вот пример обработчика запроса на 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());
}
}
- Обработчики событий.
События используются для сообщения об изменениях, происходящих в системе. Обработчики событий реагируют на события и соответствующим образом обновляют модели чтения. Вот пример обработчика событий в 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)
- Модели команд и запросов.
CQRS способствует использованию отдельных моделей для команд и запросов. Модели команд инкапсулируют данные, необходимые для изменения состояния системы, а модели запросов определяют структуры данных, используемые для получения информации. Вот пример командной модели в TypeScript:
class CreateProductCommand {
constructor(public name: string, public price: number) {}
}
class GetProductQuery {
constructor(public productId: string) {}
}
Шаблон проектирования разделения ответственности за запросы команд (CQRS) обеспечивает мощный подход к созданию масштабируемых и эффективных приложений. Разделяя операции чтения и записи, CQRS обеспечивает независимую оптимизацию и повышает общую производительность системы. В этой статье мы рассмотрели различные методы реализации CQRS, включая обработчики команд, обработчики запросов, обработчики событий и отдельные модели команд/запросов. Применяя CQRS, разработчики могут создавать надежные и масштабируемые системы, отвечающие требованиям современных приложений.