Перейти к содержанию

System Design — рабочая памятка#

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


Пять входов в документ#

Ситуация Куда идти
«Проектирую систему с нуля» 00-workflow.md — двенадцать шагов, каждый с артефактом и чек-листом
«Что вообще нужно знать и в каком порядке» 01-roadmap.md — граф зависимостей, 155 тем, три трека прохождения
«Нужен конкретный топик» Индекс тем ниже или topics/
«Есть симптом, не знаю название» Индекс «проблема → тема» ниже
«Надо выбрать из вариантов и обосновать» decisions/ — документы решений: вопросы, оси, рынок, эвристики, форма ADR

Структура#

README.md              ← вы здесь: навигация и индексы
00-workflow.md         сквозной процесс W0…W11
01-roadmap.md          карта тем, зависимости, треки чтения
topics/                карточки топиков, сгруппированы по блокам
decisions/             документы решений: что выяснить и как выбрать
  00-template.md       мастер-шаблон и правила заполнения
  01-adr-template.md   форма записи принятого решения
  02-versioning.md     версии, статусы, что перепроверять в старых ADR
  03-constraints-registry.md  форма реестра организационных ограничений
  D-01-… … D-11-…      одно решение — один документ
examples/              кейсы, проведённые через цепочку решений целиком
research/              исследование поля: какие проблемы бывают и чем закрыты
tools/check.py         проверка целостности: якоря, коды, версии, ADR, шапки
tools/style.py         язык карточек и справочников: метрики, словарь, инварианты редактуры
90-cheatsheets.md      числа, формулы оценок, матрицы выбора
91-antipatterns.md     типовые ошибки
92-glossary.md         термины RU/EN
93-style.md            правила языка и словарь терминов: по ним пишутся карточки и справочники
96-backlog.md          ревизия перекосов и очередь работ
97-card-map.md         прежние сквозные номера → коды по темам
98-revision-plan.md    развилки к решению: что менять и в каких вариантах
99-plan.md             дальнейший план: шаги, варианты, развилка
99-plan-editing.md     редактура карточек и отвязка от плейлиста: итерации, замеры, журнал
95-sources.md          библиография

Как устроена карточка#

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

Вид Строка под заголовком Разделы по порядку
Основная карточка Шаг W0…W10 TL;DR → Проблема → Как работает → Когда применять (и когда нет) → Альтернативы → Trade-offs и режимы отказа → Что мерить → Связано → Источники
Справка Справка Коротко → что важно на практике → Связано → Источники
Подробный проход Подробный проход Почему этот кейс → шаги W0…W7 с числами → Что проверяет этот кейс → Связано → Источники
Короткий разбор Короткий разбор Трудность → Решение → Компромисс → Порядок величин → Связано → Источники
Обзор Обзор Зачем → таблица разборов → Как читать такие разборы → Связано → Источники

У основной карточки порядок разделов постоянный, а набор — нет. TL;DR, «Связано» и «Источники» есть везде, остальные разделы появляются, когда им есть что сказать. Середину карточки часто занимают разделы с собственными названиями — «Модели», «Механики», «Что делать», — а таблица альтернатив может называться по предмету: «Три сигнала», «Уровни шифрования».

Карточку можно читать по диагонали: TL;DR — одна-две фразы, «Что мерить» и «Как выбирать» — всегда списком, жирная метка в начале абзаца называет его тему. Английский термин стоит в тексте, если он устоялся в индустрии; при первом упоминании в карточке рядом — русский в скобках.

Код карточки — тема плюс номер внутри неё: REL-04, CACHE-02, NET-16. Префикс говорит, из какой области карточка, без обращения к справочнику. Новая карточка получает следующий свободный номер в своём блоке; коды не перенумеровываются никогда. До 2026-09-17 нумерация была сквозной (T-001…T-151) — соответствие в 97-card-map.md.

Карточка и решение — разные жанры#

Карточка в topics/ объясняет механику: как устроено, чем платишь, что мерить. Документ решения в decisions/ ведёт к выбору: что выяснить до сравнения, по каким осям сравнивать, что отсекается без сравнения, что делать при ничьей и как записать итог в ADR.

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

Решения по шагам#

Шаг Решение Форма
W3 · Данные D-01 · Выбор хранилища полная · варианты берут с рынка
W4 · Архитектура D-05 · Границы на старте полная · гринфилд, факты предсказываются
W4 · Архитектура D-02 · Границы в работающей системе полная · факты измеряются по истории
W5 · Масштабирование D-03 · Стратегия кэширования короткая · обратимо
W6 · Согласованность D-04 · Связь в рабочем процессе полная · варианты перечисляет модель
W7 · Надёжность D-06 · Деградация при отказе и перегрузке полная · предмет — обещание, а не механизм
W3 · Данные D-07 · Декомпозиция данных полная · двусторонняя: силы разделения против сил интеграции
W3 · Данные D-08 · Миграция данных без остановки полная · третья стадия: система под изменением
W9 · Эксплуатация D-09 · Обратимость выката полная · третья стадия; предмет — существование отката, а не стратегия
W0 · Требования D-10 · Цели уровня обслуживания и их измерение полная · обещание и измеритель — одно решение
W2 · Контракты D-11 · Обещание совместимости интерфейса полная · варианты перечисляет модель; предмет — обещание и цена знания о потребителях

Форма документа зависит не от темы, а от обратимости решения, от того, откуда берутся варианты, и от стадии проекта — почему так. Одно и то же по названию решение на гринфилде и в работающей системе — это два разных документа, а не две ветки одного.

Заполненные примеры — examples/: кейсы, проведённые через всю цепочку, с настоящими числами и настоящими ADR.

Чем набор решений будет пополняться — не следующим кейсом, а опросом поля: research/00-plan.md. Два прогона показали, что документы дописываются по одному на кейс, и так может продолжаться бесконечно.

Пример Стадия Чем проверяет метод
E-01 · Бронирование билетов Гринфилд Дефицитный ресурс, атомарность, пик ×1000, ничтожный объём
E-02 · Лента новостей Работающая система Итоговая согласованность, объём решает, ровная нагрузка, три команды
E-03 · Учёт товара в пунктах выдачи Работает 11 лет, фактов о ней нет Источник истины вне системы, нагрузки нет вовсе, авторов нет, сверка вместо согласованности. Первый прогон, не потребовавший нового документа
U-01 · Передача данных по договору Узкий прогон, не сквозной Приёмник — чужая организация: ни метрик, ни отката, ни доступа. Проверяет D-08 и D-09, применённые впервые

Индекс «проблема → тема»#

Вход по симптому, когда название решения ещё неизвестно.

Симптом Куда смотреть
БД не справляется с чтениями CACHE-01 кэш · DATA-09 реплики чтения · DATA-05 индексы · ARCH-06 CQRS
БД не справляется с записями DATA-10 шардирование · MSG-02 очередь перед записью · DATA-05 LSM-индексы
Дубликаты платежей / повторные заказы NET-16 идемпотентность · MSG-06 гарантии доставки · DIST-09 уникальные ID
Данные разъезжаются между сервисами D-04 связь сервисов в процессе · MSG-07 outbox и CDC · DIST-08 saga · DIST-03 модели согласованности
Пользователь не видит только что сделанную запись DATA-09 read-your-writes · CACHE-03 инвалидация кэша · DIST-03 causal consistency
Один сбойный сервис роняет всю систему REL-01 таймауты и повторы · REL-02 circuit breaker и bulkhead · REL-04 деградация
Повторы усиливают аварию вместо восстановления REL-01 backoff и jitter · MSG-09 backpressure · EDGE-06 rate limiting
p99 в разы хуже p50 PERF-02 tail latency · PERF-10 GC-паузы · PERF-06 пулы соединений · CACHE-04 hot key
Кэш «протух» и упала БД D-03 стратегия кэширования · CACHE-04 stampede и hot key · CACHE-02 стратегии записи
Два пользователя купили один билет DATA-08 уровни изоляции · DIST-07 распределённые блокировки · CASE-08 кейс бронирования
Нужно отдать событие клиенту в реальном времени NET-12 SSE/WebSocket · MSG-10 webhooks
Долгая операция блокирует запрос MSG-02 очередь · ARCH-04 event-driven · W2 асинхронный контракт
Растёт стоимость инфраструктуры PERF-11 unit-экономика · ARCH-09 serverless · EDGE-05 CDN · W10 trade-offs
Выкатка требует простоя OPS-02 стратегии выкатки · DATA-17 миграции без простоя · REL-04 фича-флаги
Инцидент есть, причина не ищется OPS-07 трассировка · OPS-10 алертинг · OPS-13 отладка в проде
Не понятно, какая БД нужна D-01 выбор хранилища · DATA-01 выбор хранилища · DATA-03 паттерны доступа
Микросервисы стали медленнее монолита D-02 границы сервисов · ARCH-01 модульный монолит · ARCH-02 границы контекстов
Аналитика мешает боевой нагрузке DATA-15 OLTP/OLAP · MSG-11 data pipeline
API ломается у клиентов при выкатке NET-17 версионирование · NET-18 контракты и схемы
Утечка или лишний доступ SEC-04 модели авторизации · SEC-08 секреты · SEC-11 threat modeling
Систему надо перенести в другой регион REL-08 multi-region · REL-09 RPO/RTO · EDGE-09 глобальная маршрутизация
Нагрузка выросла в 10 раз, что делать первым W5 план масштабирования · DIST-01 вертикально vs горизонтально

Индекс тем#

Полный реестр 155 тем с шагами рабочего процесса — в 01-roadmap.md.

Блок Тем Файл
B01 Сеть, протоколы, API 21 topics/01-network-and-api.md
B02 Приём трафика 9 topics/02-traffic-and-edge.md
B03 Хранилища и данные 19 topics/03-storage-and-data.md
B04 Кэширование 5 topics/04-caching.md
B05 Асинхронность и сообщения 11 topics/05-async-and-messaging.md
B06 Распределённые системы 11 topics/06-distributed-systems.md
B07 Архитектурные стили 13 topics/07-architecture-styles.md
B08 Надёжность 12 topics/08-reliability.md
B09 Безопасность 13 topics/09-security.md
B10 Доставка и эксплуатация 17 topics/10-delivery-and-ops.md
B11 Производительность и стоимость 11 topics/11-performance-and-cost.md
B12 Кейсы 13 topics/12-case-studies.md

Готовность#

Строка «памятка готова» — это обещание, а по правилу набора обещание, исполнение которого нечем установить, обещанием не является. Поэтому здесь сказано, что именно готово и чем это устанавливается, что готовым не объявлено, и что открывает работу заново.

Сделано — и чем устанавливается#

Утверждение Чем устанавливается
Три слоя на месте: рабочий процесс из двенадцати шагов, дорожная карта из двенадцати блоков, 155 карточек tools/check.py, одиннадцать проверок, все зелёные
Одиннадцать документов решений — все три типа решений и обе неполные формы то же
Каждый документ применён хотя бы раз поле «Метод» в 23 ADR пяти прогонов
Пять прогонов: четыре сквозных (E-01, E-02, E-03, U-02) и один узкий (U-01) файл находок у каждого, с разбором каждой. Числа находок здесь не печатаются: форматы файлов разные, счётчик никто не сверяет
Обе стадии, на которых метод заявлен, пройдены сквозным прогоном гринфилд — E-01 и U-02; работающая — E-02 и E-03
В реестре общих проблем не осталось открытых записей research/10-problems.md, четыре мини-исследования
У каждого правила метода назван повод — прогон, источник или находка истории версий одиннадцати документов и мастер-шаблона

Не проверено — и названо прямо#

Что Чем это грозит
Ни одного настоящего кейса. Все пять прогонов учебные, системы вымышлены Инструмент испытан на задачах, придуманных для его испытания. Это не то же, что применение, и первое применение к живой задаче — отдельное событие
Стадия «под изменением» сквозным прогоном не пройдена Единственный прогон третьей стадии узкий и по шагам не ходил. Правило «под изменением ← работающая» выведено из разбора, а не из работы
Предсказание о жанре не разрешено Записано до работы по P-CHG-04; разрешается на решении о документе, которого ещё нет
Правило о жанре — гипотеза, подогнанная задним числом «Если варианты раскладываются таблицей приём–свойства, это карточка» выведено по четырнадцати наблюдениям после того, как они случились. Проверка — предсказание до работы, а не пересказ прошлого
Рыночный снимок один, и правила его пересъёмки нет Рынок есть только у D-01: раздел 4 снят 16.09.2026, часть строк помечена [не проверено]. Документ велит смотреть на дату съёмки, но не говорит, когда снимать заново
Содержание 155 карточек машиной не проверяется Сверяются коды, якоря, подписи и принадлежность теме. Верность самого текста держится на источниках при нём
Никто, кроме автора, метод не применял Шаг «новый документ читает кто-то, кроме автора» в мастер-шаблоне есть; исполнялся он внутри той же работы

Что открывает работу заново#

Не «когда захочется», а по событию. Любое из шести:

  1. Метод применён к настоящей задаче. Первый живой кейс отменяет главную оговорку выше — и, по опыту четырёх прогонов, принесёт MAJOR.
  2. Сквозной прогон по стадии «под изменением». Это единственное, что проверит правило наследования; до него оно предположение.
  3. Разрешилось предсказание о жанре — в любую сторону. Промах здесь дороже попадания: он означает, что признак документа сформулирован неверно.
  4. У документа появился MAJOR. По правилам версионирования это значит, что прежнее решение могло бы выйти другим, — и старые ADR надо перечитать строкой истории.
  5. Рыночный снимок разошёлся с рынком. Проверяется не календарём, а первым же случаем, когда факт из раздела 4 оказался неверен.
  6. Проверка перестала быть зелёной. Одиннадцать проверок — это и есть механизм, которым устанавливается первая таблица; красная проверка отменяет её целиком, а не частично.

Чего этот раздел не объявляет. Не «памятка закончена»: очередь бэклога открыта, и четыре кандидата из плана правок U-02 ждут следующей ревизии. Объявлено другое — что метод собран, применён и проверяем, и что его незакрытые места названы поимённо, а не оставлены на догадку читателя.

Статус документа#

Файл Статус
00-workflow.md готов
01-roadmap.md готов
topics/01–12 готовы — 155 карточек
90-cheatsheets.md, 91-antipatterns.md, 92-glossary.md, 95-sources.md, 96-backlog.md готовы
decisions/ мастер-шаблон v6.5, шаблон ADR, версионирование, реестр ограничений; D-01…D-11, все три типа решений и обе формы
research/ опрос поля закончен, четыре мини-исследования, открытых записей реестра нет; предсказания к каждому прогону
examples/E-01-booking/ пройден целиком: 4 ADR, реестр ограничений
examples/E-02-feed/ пройден целиком: 4 ADR, пять документов в MAJOR
examples/E-03-pickup/ пройден целиком: 5 ADR, один MAJOR — находки
examples/U-01-handover/ узкий прогон, 2 ADR, два MAJOR — находки
examples/U-02-reporting/ пройден целиком, восемь ADR — самый широкий прогон набора; ноль новых документов, два MAJOR, и оба у документов, применявшихся впервые — находки, план правок внесён целиком

Документ: 155 карточек в 12 блоках, сквозной workflow, четыре справочника и служебные документы. Счётчики слов, файлов и находок здесь не печатаются: их никто не сверяет, и они устаревают молча. Печатается то, что сверяет tools/check.py.

О источниках#

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

Опорные книги и наборы материалов, на которые чаще всего идут ссылки: Martin Kleppmann «Designing Data-Intensive Applications»; Michael Nygard «Release It!»; Google SRE Book и SRE Workbook; AWS Well-Architected Framework и AWS Builders' Library; Sam Newman «Building Microservices»; Alex Xu «System Design Interview» vol. 1–2. Полный список — в 95-sources.md.

С чего началось. Работа началась с плейлиста ByteByteGo — System Design Fundamentals: его 103 видео дали первый список тем. Темы, которых в плейлисте нет, — процесс проектирования, корректность распределённых операций, отказоустойчивость, эксплуатация — со временем составили больше половины карточек, и памятка от плейлиста отвязана. Карта «видео → тема» и обоснование добавленных тем остались в истории репозитория: 93-playlist-map.md и 94-gaps.md.