Что такое CQRS и как он работает в мире микросервисов
CQRS (Command Query Responsibility Segregation) - это архитектурный подход в разработке программного обеспечения, который разделяет операции на команды (command) и запросы (query).
Команды представляют действия, которые изменяют состояние системы. Например, команда может быть созданием нового пользователя, изменением его данных или удалением его из системы. Команды не возвращают значение, а только изменяют состояние системы.
Запросы, с другой стороны, используются для получения информации из системы. Они не изменяют состояние системы. Запрос может быть использован для получения списка всех пользователей, данных конкретного пользователя или какой-либо другой информации, которая не изменяет состояние системы.
CQRS предполагает, что операции чтения и записи должны быть реализованы в соответствующих отдельных слоях системы. Это позволяет разработчикам лучше оптимизировать код для каждого слоя и повысить производительность системы в целом.
Пример кода:
public interface ICommandHandler
{
void Handle(TCommand command);
}
public interface IQueryHandler
{
TResult Handle(TQuery query);
}
public class CreateUserCommand
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
public class UserCreatedEvent
{
public Guid UserId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
public interface IUserRepository
{
void Save(UserCreatedEvent userCreatedEvent);
User Get(Guid userId);
IEnumerable
}
public class CreateUserCommandHandler : ICommandHandler
{
private readonly IUserRepository _userRepository;
public CreateUserCommandHandler(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void Handle(CreateUserCommand command)
{
var userId = Guid.NewGuid();
var userCreatedEvent = new UserCreatedEvent
{
UserId = userId,
Name = command.Name,
Email = command.Email
};
_userRepository.Save(userCreatedEvent);
}
}
public class GetUserQuery
{
public Guid UserId { get; set; }
}
public class GetUserQueryHandler : IQueryHandler
{
private readonly IUserRepository _userRepository;
public GetUserQueryHandler(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public User Handle(GetUserQuery query)
{
return _userRepository.Get(query.UserId);
}
}
public class GetAllUsersQueryHandler : IQueryHandler
{
private readonly IUserRepository _userRepository;
public GetAllUsersQueryHandler(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public IEnumerable
{
return _userRepository.GetAll();
}
}
В данном примере кода мы создаем интерфейсы для команд, событий, запросов и обработчиков команд и запросов. Мы также определяем интерфейс для репозитория пользователей, который используется для сохранения и получения информации о пользователе.
CreateUserCommandHandler обрабатывает команду CreateUserCommand и создает нового пользователя. После этого сохраняется событие UserCreatedEvent с информацией о пользователе.
GetUserQueryHandler и GetAllUsersQueryHandler используются для получения информации о пользователе или списках пользователей.
Таким образом, CQRS позволяет нам разделять операции записи и операции чтения для оптимизации производительности нашей системы.