Ответ
CQRS (Command Query Responsibility Segregation) — это архитектурный паттерн, разделяющий операции чтения (Query) и записи (Command) в разные модели.
Основные идеи:
- Команды (Commands) изменяют состояние (например,
CreateUser,UpdateOrder). Они не возвращают данные, только подтверждение или ошибку. - Запросы (Queries) только читают данные (например,
GetUserByID). Они не изменяют состояние.
Преимущества:
- Масштабируемость (разные БД для чтения/записи).
- Гибкость (оптимизация моделей под конкретные задачи).
Пример на Go:
// Command (запись)
type CreateUserCommand struct {
Name string
Email string
}
func (c *CreateUserCommand) Handle() error {
// Логика сохранения пользователя
return nil
}
// Query (чтение)
type GetUserQuery struct {
ID int
}
func (q *GetUserQuery) Handle() (*User, error) {
// Логика получения пользователя
return &User{}, nil
}
Минусы: Усложнение архитектуры, eventual consistency.