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 карточек машиной не проверяется | Сверяются коды, якоря, подписи и принадлежность теме. Верность самого текста держится на источниках при нём |
| Никто, кроме автора, метод не применял | Шаг «новый документ читает кто-то, кроме автора» в мастер-шаблоне есть; исполнялся он внутри той же работы |
Что открывает работу заново#
Не «когда захочется», а по событию. Любое из шести:
- Метод применён к настоящей задаче. Первый живой кейс отменяет главную оговорку выше — и, по опыту четырёх прогонов, принесёт MAJOR.
- Сквозной прогон по стадии «под изменением». Это единственное, что проверит правило наследования; до него оно предположение.
- Разрешилось предсказание о жанре — в любую сторону. Промах здесь дороже попадания: он означает, что признак документа сформулирован неверно.
- У документа появился MAJOR. По правилам версионирования это значит, что прежнее решение могло бы выйти другим, — и старые ADR надо перечитать строкой истории.
- Рыночный снимок разошёлся с рынком. Проверяется не календарём, а первым же случаем, когда факт из раздела 4 оказался неверен.
- Проверка перестала быть зелёной. Одиннадцать проверок — это и есть механизм, которым устанавливается первая таблица; красная проверка отменяет её целиком, а не частично.
Чего этот раздел не объявляет. Не «памятка закончена»: очередь бэклога открыта, и четыре кандидата из плана правок 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.