Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: cqrs

Что такое CQRS, зачем разделять операции чтения и записи и как это реализуется, например, при использовании реплик базы данных?

Вопрос проверяет понимание архитектурного паттерна CQRS и практическое применение при использовании репликации баз данных.

Короткий ответ

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

Длинный ответ

CQRS и разделение моделей чтения и записи

Определение: CQRS — паттерн, разделяющий ответственность между командами (изменения состояния) и запросами (чтение информации).

1. Проблемы монолитной модели данных

Одна и та же модель сущности обслуживает:

  • и обновления

  • и чтение

  • и валидацию

  • и бизнес-логику

  • и индексацию

Это приводит к:

  • сложности расширения

  • перегрузке БД

  • смешению ответственности

  • проблемам масштабирования


2. Основные идеи CQRS

Модель разделяется на две части:

  1. Команды (Write Model)

    • выполняют действия, меняющие состояние

    • могут быть сложными

    • обеспечивают консистентность

    • пишут в мастер-базу / event store

  2. Запросы (Read Model)

    • оптимизированы для чтения

    • могут иметь простую структуру

    • часто используют отдельную БД или реплики

    • можно кэшировать, шардировать, денормализовать

Разделение упрощает каждую сторону и улучшает масштабируемость.


3. CQRS + репликация базы данных

Стандартная схема:

  1. Команды → мастер БД

  2. Мастер реплицирует данные в несколько slave-реплик

  3. Запросы из API → идут в реплики

Преимущества:

  • высокая производительность для чтения

  • разгрузка мастера

  • устойчивость к нагрузке

  • возможность геораспределённых реплик

Важный аспект: задержка репликации

Replica lag может приводить к тому, что:

  • запись уже выполнена

  • а чтение из реплики показывает устаревшее состояние

CQRS подразумевает eventual consistency — временная расхождённость допустима.


4. CQRS в архитектуре

Обычно:

  • Write-модель строгая, нормализованная

  • Read-модель денормализованная, агрегированная под конкретный UI

Пример:

  • для команды "создать заказ" используется полная модель Order

  • для фронта нужен простой объект: {orderId, total, status, itemsCount}

Read-модель может жить в:

  • PostgreSQL репликах

  • Redis

  • ElasticSearch

  • ClickHouse

  • ...любых системах чтения


5. Пример реализации с репликами

Псевдокод:

php

// Write
$writeDb->insertOrder($orderData); // мастер

// Read
$orderInfo = $readDb->fetchOrderSummary($orderId); // реплика

Маршрутизатор БД:

php

if ($query->isWrite()) {
    return $masterConnection;
} else {
    return $replicaPool->getRandomReplica();
}

6. Когда CQRS особенно полезен

  • много чтений и мало записей

  • микросервисная архитектура

  • высокие пиковые нагрузки

  • сложные агрегаты (например, расчёт отчётов)

  • системы с rich domain model

  • event-driven архитектуры


7. Вывод

CQRS позволяет разделить ответственность между чтением и записью, оптимизировать каждую сторону и улучшить масштабируемость. Репликация БД — простой способ реализовать CQRS на практике: команды пишут в мастер, а запросы обслуживаются из реплик.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Postgres

    Postgres

Ключевые слова

#cqrs

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.