System Design Space
Граф знанийНастройки

Обновлено: 30 апреля 2026 г. в 07:40

Принципы проектирования масштабируемых систем

средний

Как выбирать следующий рычаг роста системы: Scale Cube, CAP и PACELC, архитектура без сохранения состояния, кэширование, асинхронная обработка и устойчивость под нагрузкой.

Масштабируемость почти никогда не упирается в одно большое ограничение навсегда. По мере роста нагрузки узкое место переезжает из вычислений в данные, затем в координацию и устойчивость.

Эта глава собирает в одну картину куб масштабирования, теоремы CAP и PACELC, кэширование, асинхронную обработку, CQRS и паттерны отказоустойчивости, чтобы было видно, какой рычаг действительно помогает на текущем этапе роста системы.

В архитектурных обсуждениях и на интервью такой взгляд особенно полезен: он позволяет объяснять масштаб не через список знакомых терминов, а через приоритеты качества, текущее ограничение и цену следующего решения.

Практическая польза главы

Приоритеты качества

Сначала определяйте, что важнее для системы: доступность, свежесть данных, скорость ответа или устойчивость под перегрузкой.

Рычаги масштаба

Различайте, когда помогает клонирование сервисов, когда нужна работа с данными, а когда уже пора менять модель координации между компонентами.

Паттерны роста

Связывайте кэширование, асинхронность, CQRS и устойчивость не как набор трюков, а как последовательные этапы взросления системы.

Аргументация выбора

На интервью и в проектных обсуждениях объясняйте, какое ограничение снимает решение и какую новую цену система платит взамен.

Теория

Designing Data-Intensive Applications, 2nd Edition

Одна из самых сильных книг о росте данных, консистентности и архитектурных компромиссах.

Читать обзор

важна не сама по себе, а как способность системы выдерживать рост без потери управляемости. На практике узкое место почти никогда не остаётся одним и тем же: сначала система упирается в вычислительный слой, потом в данные, затем в координацию между компонентами и устойчивость при сбоях. Поэтому полезно понимать не только список техник, но и порядок, в котором они начинают приносить реальную пользу.

Куб масштабирования (Scale Cube)

удобен тем, что заставляет говорить о росте системы не абстрактно, а через конкретный рычаг: мы копируем одни и те же экземпляры, делим систему по функциям или разрезаем данные на независимые сегменты.

Ось X: клонирование

Копии

Самый быстрый способ вырасти: запустить несколько одинаковых экземпляров за балансировщиком и распределить запросы между ними.

Хорошо подходит для раннего роста и простого веб-слоя
Не решает проблем общей базы данных и связанного домена

Ось Y: разделение по функциям

Сервисы

Система делится на самостоятельные части: например, каталог, корзина, платежи и уведомления получают отдельные границы и отдельные темпы роста.

Позволяет масштабировать дорогие домены независимо
Повышает цену координации, интеграции и наблюдаемости

Ось Z: разбиение данных

Сегменты

Один и тот же сервис обслуживает только часть пространства данных: по региону, клиенту, диапазону ключей или другому правилу маршрутизации.

Помогает расти там, где уже не хватает одного набора данных
Делает ребалансировку и межсегментные запросы заметно сложнее

Подробнее

CAP теорема

Формальная рамка, которая помогает честно обсуждать ограничения распределённых систем.

Читать обзор

Теорема CAP

напоминает: при распределённая система не удержит одновременно и , и . Это не абстрактная теория, а реальный , который приходится принимать под конкретные требования продукта.

C

Консистентность

Все узлы видят одно и то же состояние после завершения операции.

A

Доступность

Каждый корректный запрос получает ответ даже при частичных отказах.

P

Работа при разделении сети

Система продолжает жить, даже если часть узлов временно перестала видеть друг друга.

Практический смысл: при сбое сети мы не выбираем “идеальную архитектуру”, а решаем, что для системы опаснее именно сейчас: отдавать устаревшие данные или терять ответы для части клиентов.

Подробнее

PACELC теорема

Расширяет теорему CAP и помогает говорить о компромиссах даже в штатном режиме.

Читать обзор

Теорема PACELC

делает картину честнее: даже когда сеть работает нормально, система всё равно выбирает между более строгой консистентностью и более низкой .

Partition → Availability vs Consistency, Else → Latency vs Consistency

PA/EL-системы

При разделении сети стараются не терять ответы, а в штатном режиме делают ставку на более быстрые отклики.

Типичные примеры: Cassandra, DynamoDB

PC/EC-системы

И при сбое сети, и при обычной работе сильнее тяготеют к строгой консистентности, принимая более дорогой путь записи и чтения.

Типичные примеры: HBase, синхронно реплицируемые Postgres и MySQL

Почему это важно: эта модель помогает объяснить, почему быстрая система не всегда строгая, а строгая система не всегда быстрая. Именно здесь обычно формируется архитектурный приоритет продукта.

Архитектура без сохранения состояния

Вычислительный слой почти всегда оказывается первым рычагом роста. Когда экземпляры можно свободно заменять, их проще добавлять через и безопаснее обновлять через . Всё, что относится к корректности, лучше выносить во внешний слой .

Автомасштабирование действительно помогает

Инстансы можно добавлять и убирать без сложной ручной координации.

Релизы становятся безопаснее

Сервис легче выкатывать по частям, не теряя пользовательское состояние внутри процесса.

Восстановление ускоряется

Упавший экземпляр заменяется новым, а не чинится как уникальный артефакт.

Важно: отсутствие локального состояния не запрещает кэши и оптимизации в памяти. Оно означает только одно: корректность системы не должна зависеть от памяти конкретного процесса.

Связанная глава

Репликация и шардинг

Подробный разбор топологий, компромиссов и операционных рисков роста данных.

Читать обзор

Паттерны масштабирования баз данных

Как только одного набора данных и одного пути записи перестаёт хватать, приходится выбирать между топологиями , и . При любой схеме быстро всплывает цена отставания: напрямую влияет на свежесть чтения и поведение после переключения.

Шардинг

Горизонтальное разбиение помогает расти по записи и объёму данных, но требует заранее подумать о ключе маршрутизации и цене будущего перераспределения.

По диапазонам ключейудобно для упорядоченных запросов
По хэшу ключалучше выравнивает нагрузку
Через справочникдаёт гибкость, но добавляет слой маршрутизации
Межсегментные запросы и последующее переразбиение почти всегда обходятся дороже, чем кажутся на старте.

Репликация

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

Один ведущий и репликипростая эксплуатация, но один центр записи
Несколько ведущих узловгибче по записи, но тяжелее по конфликтам
Без ведущего узлахорошо для распределённого мира, но дороже по чтениям
Главный практический вопрос здесь не “какая схема моднее”, а как вы контролируете отставание, переключение и поведение клиента при несвежем чтении.

Связанная глава

Стратегии кэширования

Более глубокий разбор паттернов кэша, их плюсов и эксплуатационных ловушек.

Читать обзор

Кэширование

, и действительно снижают нагрузку и ускоряют чтение, но каждый подход по-своему увеличивает риск вернуть или усложнить путь записи.

🌐

CDN

~5 ms

📦

Redis / Memcached

~1-5 ms

💾

Локальный кэш

~0,1 ms

🗄️

База данных

~10-100 ms

Ленивое заполнение

Приложение сначала проверяет кэш, а при промахе идёт в базу и затем заполняет кэш.

Запись через кэш

Запись проходит через кэш, который синхронно обновляет основное хранилище.

Отложенная запись

Кэш собирает обновления и сбрасывает их в хранилище пакетами, покупая скорость ценой риска.

Упреждающее обновление

Горячие объекты обновляются заранее, чтобы не отдавать первый медленный ответ после истечения времени жизни записи.

Задержка и пропускная способность

отвечает за объём работы, который система успевает выполнить за единицу времени, а и показывают, насколько система остаётся быстрой на самом неприятном хвосте распределения. Когда растёт , без очередей и средние значения быстро перестают описывать реальный пользовательский опыт.

Задержка

Время от запроса до ответа. На пользовательском пути важны не средние, а именно хвост распределения и повторяемость результата.

  • Главные метрики: p50, p95 и 99-й перцентиль
  • Частые причины роста: очереди, блокировки, лишние сетевые переходы

Пропускная способность

Количество операций или байтов в секунду. Критична для фоновых конвейеров, очередей и систем, где важен суммарный объём работы.

  • Главные метрики: RPS, ops/sec, bytes/sec
  • Частые причины роста цены: блокирующий I/O и недостаток параллелизма

Приоритет скорости ответа

Кэширование, короткий критический путь, распараллеливание и предвычисление.

Приоритет объёма работы

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

Главный компромисс

При высокой утилизации задержка растёт нелинейно, поэтому систему нужно учить замедляться раньше, чем она начнёт захлёбываться.

Практическое правило: для интерактивных сценариев обычно важнее сохранить короткий путь ответа, а для фоновых конвейеров — удержать общий объём работы без перегрузки инфраструктуры.

Связанная глава

Асинхронная обработка и событийно-ориентированная архитектура

Разбирает очереди, события и гарантии доставки подробнее.

Читать обзор

Асинхронная обработка

Асинхронность полезна тогда, когда тяжёлую работу нужно убрать с пользовательского пути, не потеряв контроль над тем, как и когда она будет завершена. Поэтому вопрос очередей — это не только про пропускную способность, но и про : что происходит при дубликатах, задержках и повторной обработке.

Очереди сообщений

Хорошо подходят для отделения тяжёлой обработки от пути ответа пользователю и для выравнивания кратковременных всплесков нагрузки.

Продюсер
Очередь
Потребитель
Kafka
для большого потока и долговечного журнала
RabbitMQ
для гибкой маршрутизации и приоритетов
SQS
для управляемого облачного сценария без своей инфраструктуры

Событийное взаимодействие

Помогает сервисам реагировать на изменения состояния без жёсткой синхронной связности и даёт возможность масштабировать потребителей независимо друг от друга.

OrderCreated →
InventoryService
PaymentService
NotificationService
Kafka
для потоков событий и долговечного лога
Pulsar
для мультитенантного и геораспределённого сценария
NATS
для очень быстрых потоков публикации и подписки
EventBridge
для управляемой шины событий в AWS
Pub/Sub
для управляемых событийных сценариев в облаке

CQRS: разделение команд и чтения

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

Модель записи

Оптимизируется под корректность, транзакции и валидацию входящих изменений.

Модель чтения

Оптимизируется под быстрые выборки, агрегации и представления для клиентов.

Полезен там, где чтения и записи нагружают систему по-разному и требуют разных моделей данных.

Связанная глава

Паттерны отказоустойчивости

Детальный разбор устойчивости, деградации и каскадных сбоев.

Читать обзор

Паттерны устойчивости

, , и нужны не для красоты на схеме. Это рабочие механизмы, которые ограничивают радиус поражения, когда зависимость уже деградировала и система должна пережить перегрузку без каскадного обвала.

Размыкатель цепи

Временно прекращает вызовы нестабильной зависимости и даёт ей шанс восстановиться, не утащив за собой основной поток запросов.

Closed
Open
Half-Open

Обратное давление

Помогает системе честно признать перегрузку раньше, чем она начнёт бесконтрольно накапливать очередь и ронять всё вокруг.

  • ограниченные очереди
  • контроль допуска, например HTTP 429
  • упрощённые ответы в режиме деградации

Повторы и идемпотентность

Повторы неизбежны, но они не должны создавать двойные платежи, повторные заказы и другие дорогостоящие побочные эффекты.

Idempotency-Key: abc-123-def

Изоляция по отсекам

Разделяет ресурсы между критичными функциями, чтобы перегрузка одного участка не высосала все потоки, соединения и время выполнения у соседей.

Самая полезная мысль здесь: важнее изолировать последствия, чем надеяться на идеальное поведение зависимостей.

Фундамент

Протокол HTTP

L7-балансировка строится поверх HTTP и правил маршрутизации.

Читать обзор

Связанная глава

Алгоритмы балансировки

Отдельная глава про алгоритмы распределения запросов и их поведение под разной нагрузкой.

Читать обзор

Балансировка нагрузки

Алгоритмы

Round Robinпо очереди
Weighted RRс учётом мощности узлов
Least Connectionsк наименее занятому экземпляру
IP Hashдля закрепления сессий

Уровни

L4 (Transport)

быстрый и простой путь на TCP/UDP-уровне

L7 (Application)

даёт маршрутизацию по URL, заголовкам и другим признакам запроса

DNS-based

используется для геораспределения и переключения между регионами

Сводная таблица паттернов

ПаттернЧто даётЦена решения
Горизонтальное масштабированиеБыстрый эластичный рост вычислительного слояКоординация между копиями и общими зависимостями
ШардингРост по записи и объёму данныхРебалансировка, сложные запросы и новая операционная цена
РепликацияБольше чтений и выше устойчивостьОтставание реплик и более сложное переключение
КэшированиеСнижение задержки и разгрузка базыИнвалидация, свежесть данных и отдельные режимы отказа
Асинхронная обработкаРост пропускной способности вне критического путиОтложенный результат, дубликаты и сложность координации
Размыкатель цепи и изоляция по отсекамСдерживание каскадных сбоевБольше управляющей логики и новых граничных состояний
CQRSНезависимая оптимизация чтения и записиСложнее эволюция моделей и синхронизация между ними

Ключевые выводы

Сначала ищите текущий рычаг роста. Не каждая система сразу нуждается в шардировании, но почти каждая рано или поздно нуждается в заменяемом вычислительном слое.

Компромиссы нужно называть вслух. Теоремы CAP и PACELC, кэширование и репликация полезны ровно настолько, насколько ясно сформулированы их последствия для продукта.

Масштабирование — это всегда ещё и работа с данными. Рост редко останавливается только на сервисах: очень быстро он упирается в путь записи, свежесть чтения и управление состоянием.

Асинхронность разгружает критический путь, но не отменяет ответственность. Очереди и события снижают давление на пользователя, но добавляют дубликаты, задержки и новую операционную дисциплину.

Устойчивость надо проектировать заранее. Размыкатели цепи, ограничения очередей и изоляция ресурсов полезны только тогда, когда команда понимает, в каком режиме система будет деградировать.

Хорошее архитектурное объяснение идёт от узкого места. На интервью и в проектной работе важно не перечислить техники, а показать, какое именно ограничение вы снимаете следующим решением.

Связанные главы

  • CAP теорема - даёт формальную рамку для разговора о консистентности, доступности и поведении системы при сетевом разделении.
  • PACELC теорема - добавляет к теореме CAP главный вопрос нормального режима: что важнее для системы без аварии — минимальная задержка или более строгая консистентность.
  • Репликация и шардинг - разбирает топологии данных, ребалансировку и эксплуатационные риски, которые появляются после первого этапа роста.
  • Стратегии кэширования - помогает глубже понять, когда кэш действительно снижает задержку, а когда создаёт больше проблем с инвалидацией и свежестью данных.
  • Алгоритмы балансировки - показывает, как подбирать способ распределения трафика под профиль нагрузки и характер состояния в сервисах.
  • Event-Driven Architecture - расширяет тему асинхронной обработки: очереди, события, сценарии доставки и цена слабой связанности между сервисами.
  • Паттерны отказоустойчивости - добавляет практики защиты от каскадных сбоев и помогает связать масштабирование с устойчивостью под реальной деградацией.
  • Зачем нужны распределённые системы и консистентность - связывает рост системы с фундаментальными ограничениями сети, координации и управления состоянием.

Чтобы отмечать прохождение, включи трекинг в Настройки