> Что такое паттерн разделения на чтение и запись (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Employcity

Стек: Go

> Пример ответа

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

Пример на Go:

GO
// Модель для записи (команды)
type CreateUserCommand struct {
Name string
Email string
}
type UserWriter interface {
CreateUser(cmd CreateUserCommand) error
}
// Модель для чтения (запросы)
type UserReadModel struct {
ID string
Name string
Email string
}
type UserReader interface {
GetUserByID(id string) (*UserReadModel, error)
ListUsers() ([]UserReadModel, error)
}
// Реализация
type userRepository struct {
writeDB *sql.DB
readDB *sql.DB // может быть отдельная БД или кеш
}
func (r *userRepository) CreateUser(cmd CreateUserCommand) error {
// запись в основную БД
_, err := r.writeDB.Exec("INSERT INTO users ...", cmd.Name, cmd.Email)
return err
}
func (r *userRepository) GetUserByID(id string) (*UserReadModel, error) {
// чтение из реплики или кеша
row := r.readDB.QueryRow("SELECT id, name, email FROM users WHERE id = $1", id)
// ...
}

Преимущества: разделение ответственности, возможность оптимизировать модели под конкретные сценарии (например, денормализованные read-модели), независимое масштабирование. Недостатки: усложнение архитектуры, необходимость синхронизации данных (часто через события). В Go паттерн хорошо сочетается с event sourcing и конкурентными паттернами (каналы, горутины для асинхронной синхронизации).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью