title: Конспект материала 29 — awesome-system-design-resources (ashishps1) source: https://github.com/ashishps1/awesome-system-design-resources author: ashishps1 (Ashish Pratap Singh, AlgoMaster.io) — «бесплатные ресурсы для изучения System Design и подготовки к интервью»: ~140 ссылок, 12 тематических разделов + каталог из 45 задач с tiering Easy/Medium/Hard + 6 «must-read» engineering-статей + 10 канонических пейперов; большая часть ссылок — собственный блог автора (algomaster.io / blog.algomaster.io) конспект: подготовлено 2026-09-18, TASK-45.33; README прочитан целиком, все ссылки классифицированы по уникальности относительно 45.12–45.32; топ-5 прочитаны полностью — Top 15 Tradeoffs (AlgoMaster), Discord trillions of messages, Slack Real-time Messaging, Kleppmann «How to do distributed locking», Stripe «Payments APIs: the first 10 years» (Discord и Stripe отдают сайт только после JS — читал через r.jina.ai / web.archive, текст совпадает с оригиналом) статус: P3-источник «после секций»; единственное исключение — §3.1 (трейдоффы): это словарь развилок, дешёвый 15-минутный прогон перед любым слотом (все 15 пар — уже пройденные темы, здесь они собраны в единый чек-лист). Остальное — новые кейсы на глубину: хранилище лент (Discord), real-time доставка (Slack), локи (Kleppmann), API-эволюция (Stripe)
Материал 29: awesome-system-design-resources (ashishps1) — индекс и топ-5
Отличие от уже разобранных подборок: это не кейсы компаний (45.30), не «внутренности» по инженерным блогам (45.31) и не канон распределённых систем (45.32), а «учебник-минимум + задачник + витрина свежих инженерных статей». Ядро — короткие концепт-статьи самого автора (AlgoMaster), каталог классических задач с tiering по сложности и 6 engineering-постов 2020–2023. В отличие от karanpratapsingh (45.13) глубина концептов меньше, но зато есть два уникальных слоя, которых не было ни в одном источнике: систематический свод трейдоффов (15 пар + по статье на каждую пару) и ранжированный задачник из 45 задач. Слабости: самопиар (большая часть ссылок ведёт на AlgoMaster-блог с воронкой подписки, часть контента платная), задачи закрыты видеоразборами (пассивное смотрение), часть концептов дублирует учебники, опечатка в README (ссылка «Design Autocomplete for Search Engines» ведёт на разбор Instagram — рассинхрон текста и URL), один канон-LSM и Dynamo — это дубли уже пройденного.
1. Как устроен источник
| Кластер разделов | Что внутри | Доля (~) | Ценность для нас |
|---|---|---|---|
| Концепт-статьи AlgoMaster | Core Concepts (9), Networking (8), API Fundamentals (8), Database Fundamentals (9), Caching (5), Async-коммуникация (3), Distributed/Microservices (8), Architectural Patterns (5) — короткие объяснения по одному концепту | ~55 ссылок | Вход «с нуля» — закрыт karanpratapsingh (45.13), DDIA (45.39) и KB; не брать |
| System Design Tradeoffs | Сводка «Top 15 Tradeoffs» + отдельная статья на каждую пару (12 из 15): масштабируемость/производительность, vertical/horizontal, latency/throughput, SQL/NoSQL, CAP, strong/eventual, read-through/write-through, batch/stream, sync/async, stateful/stateless, long polling/WebSocket, нормализация/денормализация, monolith/microservices, REST/GraphQL, TCP/UDP | 13 ссылок | Уникально: единственный систематический «тренажёр трейдоффов» среди всех пройденных источников (у остальных трейдоффы разбросаны по кейсам) |
| Системный дизайн интервью (формат) | «How to Answer a System Design Interview Problem» (framework) + 2 курса + 30 концептов | 3 ссылки | Дубли методички и 45.22/45.23 |
| Каталог задач (Easy 10 / Medium 23 / Hard 12 = 45) | Классика: URL shortener, Instagram, WhatsApp, Twitter, Netflix, Uber, Kafka-аналог, Rate limiter, S3, Distributed Locking… — почти все с видеоразбором | 45 ссылок | Уникально: ранжированный задачник с разборами — ни в одном пройденном источнике; сверять с ../classic-designs.md и ../training/ |
| Must-Read Engineering Articles (6) | Discord trillions of messages (2023), Netflix in-video search, Canva 50M uploads/day, Airbnb double payments, Stripe payments APIs 10 years, Slack real-time messaging | 6 ссылок | Ядро: 4 из 6 уникальны для нас (Airbnb — дубль 45.31) |
| Must-Read Distributed Systems Papers (10) | Paxos, MapReduce, GFS, Dynamo, Kafka-paper, Spanner, Bigtable, ZooKeeper, LSM-tree, Chubby | 10 ссылок | Уникальны против 45.30–45.32: Paxos, MapReduce, GFS, Spanner, Chubby, ZooKeeper, Kafka-paper (Dynamo/Bigtable/LSM уже читали) |
| Каналы/книги | YouTube-каналы (Gaurav Sen, codeKarle, Tech Dummies, sudoCODE, Success in Tech, ByteByteGo), DDIA, AlgoMaster newsletter | 10 ссылок | ByteByteGo закрыт 45.17, DDIA — 45.39; Gaurav Sen — англ. учебник-жанр |
2. Критерии отбора топ-5
- Прямая релевантность брифу (крупноблочная схема Instagram/Twitter + отказоустойчивость) и связка с уже пройденным: 45.30 дал компоненты ленты (ID, соцграф, кэш, деградация), 45.31 — «внутренности» под капотом. Здесь берём следующий слой цельного кейса: хранилище сообщений ленты целиком (Discord), real-time доставку «сервер→клиент» (Slack — в связке с WebSocket-профилем пользователя), корректность распределённого доступа (локи Kleppmann), эволюцию API (Stripe — финтек-домен пользователя), и сквозной инструмент (трейдоффы).
- Не дублировать пройденное: кэш-кейсы закрыты (45.16/45.30), консенсус — Raft-визуализации (45.32), LSM/Dynamo/Bigtable — 45.30/45.31/45.32. LSM не берём в топ-5, хотя он в списке: Discord даёт его же на живом кейсе (compaction backlog как причина тоила) — красивее и свежее, чем пейпер 1996 года.
- Доступность и полнота: все топ-5 прочитаны целиком (Discord/Stripe — через r.jina.ai и web.archive версии, совпадают с оригиналом). Видеоразборы из «проблем» сознательно исключены из топ-5: смотреть час видео на слот неэффективно, конспекты письменных источников перечитываются за 20 минут.
- «Одна фраза на секцию»: каждый топ-материал даёт маркер, который поднимает ответ на класс глубины выше типового.
3. Топ-5
| # | Материал | Кто / год | Слой системы | Бриф / KB |
|---|---|---|---|---|
| 1 | System Design: Top 15 Trade-Offs | Ashish Pratap Singh (AlgoMaster), 2024 | сквозной словарь развилок: 15 пар «что выбираем и чем платим» с примерами | все разделы / KB — трейдоффы разъезжаются по всем § |
| 2 | How Discord Stores Trillions of Messages | Bo Ingram (Discord), 2023 | хранилище сообщений ленты: партиционирование, hot partition, защита БД, миграция DB | бриф 04–05, 08 / KB §5–§6, §9 |
| 3 | Real-time Messaging (Slack) | Sameera Thangudu (Slack), 2023 | real-time доставка «сервер→клиент»: stateful channel servers, WebSocket-шлюзы, регионализация | бриф 03, 07–08 / KB §3, §8–§9 |
| 4 | How to do distributed locking | Martin Kleppmann, 2016 | корректность распределённого доступа: efficiency vs correctness, fencing-токены, критика Redlock | бриф 09–10 / KB §7, §13 |
| 5 | Stripe's payments APIs: The first 10 years | Michelle Bu (Stripe), 2020 | эволюция публичного API: абстракции, state machine, миграция без ломки интеграций | бриф 01, 11 / KB §2; финтек-домен пользователя |
3.1 Top-15 Tradeoffs — словарь развилок (сквозной инструмент)
Выжимка. «Rule No.1 of System Design: it's all about tradeoffs» — статья-сводка 15 пар, на каждую: определение + реальный пример. Пары: 1) scalability vs performance (больше машин = сложнее координация и задержка); 2) vertical vs horizontal (простота+SPOF против «бесконечного» масштаба); 3) latency vs throughput (игры vs аналитика); 4) SQL vs NoSQL (жёсткие транзакции и сложные запросы против гибкости и масштаба — банки vs Netflix); 5) consistency vs availability (CAP: заказ на Amazon → свежий сток; мессенджер → жить всегда); 6) strong vs eventual (перевод → балансы сразу; Instagram → пост появится в лентах «скоро»); 7) read-through vs write-through cache (частые чтения — тяни в кэш при miss; бронирование билетов — пиши сразу в оба); 8) batch vs stream (выписки раз в день vs фрод-детекция в реальном времени); 9) sync vs async (оплата — ждём подтверждения; загрузка фото — фон); 10) stateful vs stateless (корзина магазина — память сессии; REST — каждый запрос самодостаточен); 11) long polling vs WebSockets (уведомления — держим запрос открытым; мультиплеер — постоянно открытый канал); 12) нормализация vs денормализация (низкая избыточность против скорости чтения — блог хранит комментарии с постом); 13) monolith vs microservices (простота старта против независимого масштабирования и координации); 14) REST vs GraphQL (простота, кэшируемость против одного запроса «что нужно»); 15) TCP vs UDP (гарантия доставки/порядка против низкой задержки — email vs стриминг/гейминг).
Что брать на секцию. - Готовый рефрен на любую развилку схемы: «вот пара, что выбрали и чем платим». Интервьюер почти всегда спрашивает «а почему так, а не иначе» — 15 заготовленных пар с примерами закрывают 90 % таких вопросов без импровизации. - Пары с числами/конкретикой лучше всего: «банки — SQL: транзакции точнее гибкости», «лента — eventual: пост появляется с задержкой и это ок» (прямо наш бриф!), «бронирование — write-through (иначе overbooking)», «CS:GO — UDP, Skype/email — TCP». - Не учить заново — все темы уже в KB/учебниках; это именно список «какие развилки обязан проговорить». Прогон = 15 минут, по одной строке на пару. - Стыкуется с методичкой: трейдофф — последний шаг любого блока ответа (назвал решение → назвал трейдофф → назвал пример).
3.2 Discord — хранилище сообщений ленты (триллионы сообщений)
Выжимка. Эволюция сообщений Discord: MongoDB → Cassandra (2017, 12 нод) → 177 нод в начале 2022 («high-toil»: on-call пейджится, латентность непредсказуема) → ScyllaDB (май 2022). Схема: PRIMARY KEY ((channel_id, bucket), message_id) — партиция = канал × bucket (статическое временное окно), сообщения сортируются по message_id (Snowflake ID — хронологически сортируемый, как у Twitter/Instagram). Болезни Cassandra: hot partition (канал с большой аудиторией: @everyone → шквал чтений в одну партицию → каскадная латентность всей ноды → страдают все запросы, т.к. чтения идут с quorum-консистентностью); чтения дороже записей (memtable + несколько SSTables против append в commit log); compaction backlog (операция «gossip dance»: вывод ноды из ротации, чтобы она доуплотнилась без трафика); JVM GC-паузы → латентные спайки (ScyllaDB на C++ без GC — ключевая мотивация миграции). Защита БД: data services на Rust между API-монолитом и кластерами — по одному gRPC-эндпоинту на запрос, без бизнес-логики; главная фича — request coalescing (несколько запросов на одну строку → один поход в БД, остальные подписываются на таск) + consistent-hash routing по channel_id (все запросы канала — в один инстанс сервиса → эффективнее коалисценция). Миграция: 3.2 млн сообщений/с через переписанный на Rust мигратор (токен-рэнджи БД + SQLite чекпоинты), застряли на 99.9999 % из-за громадных диапазонов томбстоунов в Cassandra (не скомпактились) — скомпактили диапазон, миграция за секунды; валидация — теневые чтения (малый % чтений шёл в обе БД, результаты сравнивались). Итог: 177 Cassandra-нод (4TB каждая) → 72 ScyllaDB-ноды (9TB); p99 чтения истории 40–125 мс → 15 мс; insert 5–70 мс → 5 мс; World Cup-финал выдержал без взволнованного дашборда.
Что брать на секцию. - Схема хранения ленты целиком — не было ни в одном источнике: партиционирование «channel × time-bucket + сортируемый ID» — готовая модель для блока «где храним посты/сообщения» (стыкуется с Instagram IDs из 45.30). - Hot partition — маркер-страшилка, которой отвечают на «а что ломается в шардированной ленте»: «один вирусный канал роняет латентность всей БД, потому что quorum-чтения в эту партицию забивают ноду». Защита — coalescing + consistent-hash routing (приём уровня «я думал о защите БД от пиков», редко звучит у кандидатов; то же семейство, что single-flight). - LSM на живом кейсе: пейпер 45.31 (3.4) называет причины — здесь видно следствие: compaction backlog = тоил on-call + «gossip dance». Фраза «write-heavy хранение ленты — LSM-семейство, и платишь compaction-операциями» связывает теорию с реальностью. - Снежинка: Snowflake-IDs с хронологической сортировкой вторично подтверждены (45.30 говорил то же про Instagram) — «ID = время, сортировка ленты бесплатна». - Миграция без даунтайма (dual-write + shadow reads + быстрый мигратор) — готовый ответ на «как переезжать с БД на БД» (вопрос-бонус в эксплуатации).
3.3 Slack — real-time доставка сообщений
Выжимка. Slack отправляет миллионы сообщений в день по миллионам каналов, доставка в мире — 500 мс. Ядро — четыре Java-сервиса: Channel Servers (CS) — stateful, in-memory, держат историю каналов; каждый CS мапится на подмножество каналов consistent hashing'ом (в пике ~16 млн «каналов» на хост; «канал» — абстрактный ID: user, team, file, huddle…). CHARMs — управляют consistent-hash-кольцом, заменяют сдохший CS за < 20 секунд (регистрация/обнаружение — Consul). Gateway Servers (GS) — stateful, держат юзеров и WebSocket-подписки; единственный сервис, развёрнутый по нескольким регионам (клиент цепляется к ближайшему; draining при падении региона бесшовно переводит пользователей в соседний). Admin Servers (AS) — stateless, интерфейс между Webapp-бэкендом и CS. Presence Servers (PS) — кто онлайн (зелёные точки); юзеры хэшируются на PS, клиент подписан на presence только видимых на экране юзеров. Путь сообщения: клиент → Webapp API → AS → CS канала (по кольцу) → всем GS мира, подписанным на канал → каждому клиенту с open-WebSocket на этот канал. Особая категория — transient events (не персистятся: «печатает…») — идут тем же путём без БД. Перекрёстные наблюдения: спайки трафика ровно «в час» — напоминания/запланированные сообщения; разные регионы имеют разный prime-time (multiplicative factor бродкаста отличается).
Что брать на секцию. - Эталон real-time-слоя: кандидаты обычно заканчивают на «WebSocket-серверы»; здесь — полная связка: stateful шлюзы с consistent-hash, подписки каналов, мульти-регион с draining, доставка 500 мс как измеримая цель. Готово для блока «доставка в реальном времени» в схеме чата/ленты. - Williams: presence «только видимые» — приём экономии ресурсов (не подписывать всех на всех), аналогично «лента показывает подмножество». - Прямая стыковка с профилем: Samokat Go + Kafka → WebSocket — «я строил доставку событий по WebSocket в прод; вот именно такие проблемы (подписки, регионы, reconnect)». В cover letter Runware WebSocket уже упомянут — здесь материалы, чтобы отвечать вглубь. - Transient events — ответ на «как сделать “печатает…” без записи в БД» (часто спрашивают в мессенджерах); «напоминания в топ часа — отсюда спайки» — хорошая деталь «я думал о паттернах нагрузки». - Consistent hashing снова третьим источником (CS-маппинг, data services Discord, TAO 45.30) — паттерн, который обязан называться с ходу.
3.4 Kleppmann — distributed locking (канон по локам)
Выжимка. Классика (автор DDIA), разбор Redlock. Две причины для лока: efficiency (сэкономить повторную работу — «заплатил 5 центов AWS лишний раз» — «no big deal») и correctness (не дать двум нодам испортить состояние — «кто-то получит двойную дозу лекарства»). Для efficiency достаточно одного Redis с async-репликой (потеря лока при краше — ок, и всем очевидно, что лок приблизительный). Для correctness Redlock не годится. Ключевой слом: даже идеальный лок-сервис не спасает код вида acquire → read → modify → write → release: GC-pause дольше lease-таймаута (клиент «заснул», лок истёк, другой клиент взял лок и записал, первый «проснулся» и перезаписал — испорченные данные; это был реальный баг HBase). Фикс — fencing token: монотонно растущее число от лок-сервиса (клиент 1 получил 33; после его паузы клиент 2 взял лок и токен 34; хранилище помнит «уже обработал запись с токеном 34» и отклоняет запись с токеном 33). Требует активной роли хранилища (проверять токены), но просто; в ZooKeeper fencing-токен = zxid/версия znode. Redlock fencing-токены генерировать не умеет (а для монотонного счётчика нужен консенсус) — этого одного достаточно, чтобы не использовать его там, где важна корректность. Модель: asynchronous + unreliable failure detectors; таймауты — лишь догадка о падении.
Что брать на секцию. - Готовый ответ на «как сделать распределённый лок» выше типового «Redis SETNX»: «если лок для efficiency — хватит одного Redis; если для correctness — нужны fencing-токены и проверка в хранилище, а не просто TTL» (пользователю знакомо — внутренний RPC-протокол/платежи: «двойной списания»). - Fencing-токен — редкий для кандидатов приём: «ясно, что лок нужен, но мало кто защищается от повторной записи после GC-pause». Маркер из DDIA-мира — усиливает позицию «я читал первоисточники». - Сценарий GC-pause: в ответах про «сервис завис» (бриф 09) — то же семейство, что retry storm; одна фраза «pause → lease истёк → старый воркер пишет без лока → fencing-токен отклоняет» связывает отказоустойчивость и корректность. - Спутник: Redlock-критика — красиво звучит как осознанный выбор, а не «слушал, что Redis умеет локи».
3.5 Stripe — эволюция платёжного API (10 лет)
Выжимка. Как абстракции API дрейфуют с ростом домена. 2011: Charges + Tokens — «семь строк кода» для карт: Stripe.js собирает карту → Token (секретные реквизиты у Stripe, без PCI у мерчанта) → сервер синхронно создаёт Charge. Фундамент оказался заточен под самый простой платёжный метод (карты: мгновенная финализация, нет действия клиента). 2015: ACH (финализация через дни) + Bitcoin (клиент сам инициирует, ~час до финализации) → пришлось добавлять pending-состояние в Charge, а для Bitcoin — отдельный BitcoinReceiver (второй state machine!). 2015–2017: Sources API — единый клиентский ресурс на все методы, но серверная пара «Source + Charge» = две state machine с разными состояниями и путями; iDEAL-кейс — «клиент заплатил в банке, браузер потерял коннект, server никогда не создал Charge → возврат денег» (потеря конверсии); вебхуки charge.succeeded — в критическом пути сбора денег. 2018: PaymentIntents + PaymentMethods (комната Lynx, 5 человек, 3 месяца, закрытые ноутбуки, «цвета и фигуры» на доске вместо имён, гипотетические интеграционные гайды на каждый метод — включая «отправка денег голубем»). PaymentMethod = «как» (статика: способ и реквизиты), PaymentIntent = «что» (stateful: сумма, попытки); единый state machine: requires_payment_method → requires_confirmation → requires_action → processing → succeeded / нет failed — неудачная попытка возвращает в requires_payment_method (клиент повторяет с другим методом тем же объектом); единственный обязательный вебхук payment_intent.succeeded — не в критическом пути. Роллаут занял ~2 года: нельзя ломать интеграции — layered migration: PaymentIntent создаёт Charge под каждую попытку, аналитика/отчётность продолжают работать на старом ресурсе; Charge разросся с 11 до 36 свойств (5 → 14 параметров создания) — отсюда polymorphic payment_method_details (типизированный хэш, чтобы верхний уровень ресурса не распухал). Процессные уроки: «запирали в комнате и принимали решения быстро, даже если потом отменяли».
Что брать на секцию. - API-дизайн как история: «абстракции под первый use case не переживают второй домен — перепроектируй под один state machine, а не статус за статусом» — сильный ответ на «спроектируй API» (бриф 01) и на «как мигрировать публичный API без ломки клиентов» (layered migration). - State machine как инструмент: «у платёжной сущности один state machine, нет failed — неудача возвращает в начало, клиент пробует другой метод»: готовый паттерн для денежных/заказных сущностей (значает «я проектировал деньги» — профиль: финансы в Balance Platform/Raiffeisen). - Не-критичный вебхук — та же идея, что (3.2) outbox: «оповещение о результате не блокирует основной путь» — связка с 45.31 (3.2). - Card ≠ норма: «методы со сдвинутой финализацией (ACH дни, Bitcoin часы) ломают синхронную модель» — хорошо для вопросов про деньги/асинхронность. - Не для схемы Instagram/Twitter — но для пользователя это «свой домен»: эпизод про костыли статусами — почти дословно про «статусы и стейты в платежах», о которых он писал в applications.
4. Второй эшелон
| Материал | Что даёт | Когда |
|---|---|---|
| Canva: scaling media uploads 0 → 50M/day | Пайплайн загрузки медиа (upload → resize → CDN): транзитные хранилища, асинхронная обработка, регионы | продолжение Instagram-схемы (медиа-объекты брифа) — бриф 04–05 |
| Spanner (OSDI'12) | Глобально-распределённая БД с внешней консистентностью: TrueTime, 2PC — противовес «AP-канону» Dynamo | вопрос «а бывает global strong consistency» (бриф 09) |
| ZooKeeper: Wait-free coordination (Usenix'10) + Chubby (OSDI'06) | Координационные сервисы: zxid как fencing-токен (Kleppmann 3.4) на практике; Chubby — «локи» Google | уточняющий вопрос про координацию/статьи — бриф 09–10 |
| Kafka: a Distributed Messaging System for Log Processing (2011) | Оригинальный пейпер Kafka — дополняет The Log (45.31 3.1) «как это реализовано»; partition-порядок, consumer pull | бриф 07; глубина по очереди |
| Design a Distributed Job Scheduler + Design Notification Service | Письменные разборы (не видео) задач, которых нет в classic-designs.md: джоб-планировщик, нотификационный сервис (fan-out!) |
сверка своих схем с «эталоном» (бриф 07, 10) |
| Каталог задач Easy/Medium/Hard (45 шт.) | Ранжированный задачник для тренировок — правильная последовательность «easy → medium → hard» | тренировки после секций, ../training/ |
| Gossip Protocol + Heartbeats + Service Discovery | Три коротких концепта по 10–15 мин, которых не было ни в одном источнике (Consul/Slack 3.3 их использует) | уточняющие вопросы по кластеру (бриф 10) |
| GFS (SOSP'03) + MapReduce (OSDI'04) | Гиганты Google-канона целиком (Chubby как координатор — по цепочке: GFS→Chubby→Bigtable) | «назовите оригинал»; короткий прогон, остальное — контекст |
| Paxos Made Simple (Lamport) | Первоисточник консенсуса; читается тяжело — вход ими остаётся Raft-визуализации (45.32) | только если дойдут руки после секций |
| Airbnb: Avoiding double payments | Уже в 45.31 (второй эшелон) — идемпотентность в платежах | дубль, не открывать заново |
| Netflix In-Video Search | Поиск внутри видео (визуальный контент) | вне брифа (ниша) |
| «30 System Design Concepts» + «How to Answer…» (framework) + курсы | Вход «с нуля» и формат интервью | закрыты учебниками (45.13/45.39) и методичкой |
5. Как использовать
- Перед любым слотом — только §3.1 (трейдоффы): 15 пар × одна строка = 15-минутный прогон-словарь. Не открывать новое: остальное — глубина для следующих секций (P3).
- Связка компонентов ленты теперь полная: ID (Snowflake — 45.30/3.2) → хранилище сообщений (Discord 3.2) → доставка real-time (Slack 3.3) → кэш лент (TAO 45.30, CacheFront 45.31). Вопросы «а как лента хранит сообщения» и «как доставляется» больше не открытые.
- Словарь развилок из §3.1 — приём «назвал трейдофф + пример» расставляется в любом блоке ответа (методичка: решение → трейдофф → пример).
- Локи (3.4) и API (3.5) — «свои» темы пользователя: деньги и корректность; маркеры fencing-токен и «один state machine вместо статусов» звучат экспертно именно в финтех-контексте.
- Чего в репо нет: BOE-чисел (KB §1), RU-моков (45.26/45.27), стратегии интервью (методичка), глубины по хранилищам (DDIA 45.39). Задачник (Easy→Hard) пригодится после секций как каталог тренировок; письменные разборы scheduler/notification — для сверки в
../classic-designs.md.
Связанные документы
../knowledge-base.md— §3 (сеть/доставка), §4 (кэш), §5–§6 (хранилища, шардирование/LSM), §7 (согласованность/локи), §8 (очереди/потоки), §9 (отказоустойчивость), §10 (эксплуатация), §13 (прикладные компоненты — локи)../classic-designs.md— §2 (лента: fan-out), §7 (эталонные схемы); письменные разборы ashishps1 — на сверкуlsd-awesome-scalability.md— материал 26: компоненты ленты (ID/соцграф/кэш); Discord 3.2 и Slack 3.3 — их «хранилище и доставка»lsd-interviewready-resources.md— материал 27: The Log (↔ Kafka-paper), LSM (↔ ScyllaDB в 3.2), Transactional Outbox (↔ «не-критичный вебхук» в 3.5)lsd-awesome-distributed-systems.md— материал 28: Raft (вход в консенсус; Paxos — первоисточник), Dynamo (канон, в курсе)learn-system-design-index.md— индекс подборки (этот материал — №29, Advanced, P3)