title: Конспект материала 15 — Architecture Notes (architecturenotes.co) source: https://architecturenotes.co/ author: Mahdi Yusuf (Substack) конспект: подготовлено 2026-09-17, TASK-45.19; архив выгружен целиком через API Substack — 20 постов за 2022-05..2025-06 (12 бесплатных, 8 платных); прочитаны полные тексты всех топ-5 и 12 Factor; выжимки по фактам из текстов, не по заголовкам статус: P3-источник к слотам 21–22.09. Сайт мал и уже не активен (последняя содержательная статья — январь 2023, дальше анонс переезда и эссе про AI), но бесплатное «Explained»-ядро 2022 года — это готовые deep-dive карточки по Redis, шардированию, индексам, LB и гранулярности сервисов: по одному на тему брифа. Подписка не нужна
Материал 15: Architecture Notes — индекс и топ-5
Architecture Notes — персональный блог Mahdi Yusuf: длинные эссе «Explained» по архитектуре реальных компонентов (Redis, RDBMS, LB, шардирование) с инфографиками. Это не учебник (роль учебников у нас — SDP, karanpratapsingh, DDIA) и не банк кейсов (роль живых кейсов — блог ByteByteGo, материал 12). Ценность другая: это готовые «карточки глубины» — по одному эссе на тему брифа, каждое читается за 15–25 минут и даёт слой «как это устроено внутри», которым отвечают на уточняющие вопросы интервьюера (устройство Redis, цена 2PC, изоляция в RDBMS).
1. Как устроен источник
| Формат | Что это | Доля | Ценность для нас |
|---|---|---|---|
| Серия «Explained» | Длинные технические эссе по одному компоненту: Redis, реляционные БД, шардирование, LB, шифрование, виртуализация. Инфографика + разбор внутренностей и трейдоффов | ~50% постов | Ядро: карточки глубины по темам брифа |
| Arc Notes / короткие заметки | Интервью (Datasette/Simon Willison), анонсы CTF, переезд на Substack | ~15% | Пропускаем |
| Платная серия | Fallacies of Distributed Systems, Latency, Quorums, Circuit Breakers, Locking and Contention, Virtualization, Types of Memory, Technical Debt | 8 из 20 постов | Темы перекрыты нашими бесплатными материалами (§5) — подписка не нужна |
Публикация фактически заморожена: содержательный поток — май 2022 – январь 2023, дальше анонс переезда на Substack (2024) и одно эссе про AI-код (2025). Это не минус для подготовки: формат «компонент объяснён целиком» устаревает медленно.
2. Критерии отбора топ-5
- Прямая релевантность секции: крупноблочная схема сервиса класса инстаграм/твиттер + отказоустойчивость; темы брифа — хранилища, кэш, шардирование, масштабирование, уровень архитектуры.
- Доступность: все топ-5 — бесплатные, прочитаны полностью.
- Не дублировать уже покрытое: кэш-паттерны (cache-aside, инвалидация, herd) у нас уже закрыты кейсом Facebook/Memcached (материал 12 §3.3), поэтому Redis берём не как «ещё один кэш-кейс», а как устройство Redis-топологий и персистентности — этого нигде больше нет.
3. Топ-5 статей
| # | Статья | Дата | Тема | Бриф / KB |
|---|---|---|---|---|
| 1 | Redis Explained | 2022-08-11 | кэш: топологии, персистентность | бриф 06 / KB §4–§7, §9 |
| 2 | Database Sharding Explained | 2022-12-12 | шардирование: когда и как | бриф 05 / KB §6–§7 |
| 3 | Relational Databases Explained | 2022-06-27 | хранилища: индексы и транзакции | бриф 04, 09 / KB §3, §7 |
| 4 | Load Balancers | 2022-11-02 | масштабирование: LB, L4/L7, strangler | бриф 03 / KB §3, §9 |
| 5 | Monoliths, Service Architecture, and Microservices | 2022-08-27 | гранулярность сервисов | бриф 11 / KB §14 |
3.1 Redis Explained (2022-08-11) — карточка глубины по кэшу
Выжимка. Redis = «REmote DIctionary Service», in-memory сервер структур данных, а не просто KV: структуры с нуля вместо сортировки строк; изначально сравнивали с Memcached (тот — только LRU, без типов данных и персистентности; зато многопоточный, Redis — однопоточный), но Redis вырос в полноценное хранилище для отдельных сценариев. Четыре топологии, по нарастанию сложности: Single Instance (просто; падение инстанса = деградация системы; при деплое на той же машине — быстрый выигрыш) → HA (main + реплики: у каждой репликации replication ID + offset; разъехались на несколько команд — досылаем недостающее, неизвестен ID/offset — полный sync через RDB-снапшот + буфер промежуточных апдейтов) → Sentinel (кластер наблюдателей: monitoring / notification / failover / service discovery — клиент спрашивает у сентинелов, кто сейчас main; отказ main фиксируется кворумом; рекомендация автора — сентинел рядом с каждым app-сервером, минимум 3 ноды с кворумом 2; при нетворк-сплите записи ушедшей в меньшинство старой main теряются) → Cluster (горизонтальное масштабирование: 16384 hashslot'а; ключ → hash → слот → шард; решениешардинг = перенос слотов между шардами без даунтайма, а не перенос ключей; здоровье кластера — gossiping; риск split-brain при неверном кворуме; правило: нечётное число primary + по 2 реплики). Вся репликация асинхронна — durability-гарантий нет; смягчение: main перестаёт принимать записи, если хотя бы одна реплика не подтвердила. Персистентность: RDB (point-in-time снапшоты — потери между снапшотами, быстрый загруз) / AOF (append-only лог команд + fsync — долговечнее, но не компактен; при рестарте с обоими включёнными побеждает AOF) / никакой (быстрее всего). Самое элегантное: снапшоты через fork + copy-on-write — ребёнок шарит страницы памяти, ядро копирует страницу только при записи, гигабайты снапшотятся быстро и с минимальной доплатой памяти. Философия автора: «Redis быстр, и все гарантии консистентности уступают скорости».
Что брать на секцию. - Готовый ответ на «какой кэш и как деплоите»: single → HA-реплики → Sentinel → Cluster — прогрессия по мере роста, называть с трейдоффами. Это одновременно ответ на «что будет, если кэш умрёт» (KB §4): кэш-слой сам спроектирован с фейловером. - Hashslot'ы (16K) — лучший короткий ответ на «как решардингить без остановки»: ключи маппятся в слоты, между шардами двигаем слоты, а не ключи. Связка с consistent hashing (KB §6) — два конкурирующих механизма решения той же задачи. - Quorum на примере сентинелов — конкретика для KB §7/§9: 3 ноды / кворум 2, split-brain, потери записей меньшинства. «А что с записями на отрезанной main?» — частый добивающий вопрос. - fork + COW — аргумент уровня «понимаю внутренности»: как однопоточный сервис делает снапшот гигабайт памяти без остановки мира. - Честная фраза про трейдофф: «кэш спроектирован на скорость, async-репликация = возможная потеря последних записей; для ленты приемлемо, для денег — нет».
3.2 Database Sharding Explained (2022-12-12) — шардирование с приоритетом «сначала простое»
Выжимка. Тон post'а — антиэнтузиазм: «у меня были таблицы в миллиарды строк без шардирования — паттерн доступа не требовал»; «если проблема решается машиной побольше, в 9 случаях из 10 это и есть правильный ответ». Чек-лист альтернатив ДО шардирования: do nothing (нет узкого места — не трогаем) → vertical scaling (RAM/CPU/диск без редизайна) → replication (масштабирует чтение: больше копий + балансировка/геораспределение; WAL — durable-лог, из которого PostgreSQL/MySQL реплицируют и восстанавливаются; запись хуже — её надо довести до каждой ноды) → специализированные хранилища (поиск → Elasticsearch, блобы → S3 вместо реляционного хранилища). Если всё же шардируем — термины: shard key (часть первичного ключа, решает распределение; данные с одним ключом живут на одной ноде), logical shard (группа данных с одним ключом, атомарна — на одну ноду) vs physical shard (нода с несколькими логическими). Три стратегии: key-based (детерминированный хеш: равномерно, адресация на лету, но решардинг труден), range-based (диапазоны + lookup-таблица; ключ с высокой кардинальностью и равномерным распределением, иначе hotspot — узел упёрся в ресурс; авторский пример celebrity-hotspot'а — «Bieber Bug»), relationship-based (связанные данные на одном физическом шарде: пользователь + посты + комментарии — сильнее консистентность внутри, меньше cross-shard запросов; пример — Instagram). Кросс-шард: рано или поздно любой живой сервис упрётся в global transaction; 2PC — лидер пишет durable-запись транзакции, участники фиксируют готовность, лидер коммитит после всех подтверждений; цена — write amplification (минимум одна запись на участника + запись транзакции) и read amplification (каждое чтение, даже нетранзакционное, обязан фильтровать недоведённые состояния); чем дольше открыта транзакция, тем больше contention и отказов.
Что брать на секцию. - Секвенция «do nothing → вертикаль → реплики → спец-хранилища → шардирование» — идеальный ответ на «когда будете шардировать ленту?»: сначала показать зрелость, потом схему. Совпадает с KB §6. - Выбор стратегии под наш кейс: лента/чат — relationship-based по user_id (все данные пользователя на одном шарде: локальность + консистентность), селебрити — hotspot «Bieber Bug», снимается pull-стратегией (KB §1, classic-designs §2). - Кардинальность ключа шардирования — готовый уточняющий вопрос интервьюеру/себе: «какое распределение значений ключа? проверяли на реальных данных?» - Цена 2PC (write+read amplification, «фильтровать недоведённое состояние в каждом чтении») — конкретика для брифа 09/KB §7: почему избегаем кросс-шард транзакций и строим модель без них (данные пользователя на одном шарде — relationship-based это и покупает).
3.3 Relational Databases Explained (2022-06-27) — индексы и транзакции изнутри
Выжимка. Две темы, которые автор считает минимальным набором про RDBMS. Индексы: структура данных, ускоряющая поиск ценой хранения и замедления записи; leaf-ноды индекса — компактное представление колонки → легко кэшируется + указатель на место строки на диске; порядок листьев держит двусвязный список (вставка/удаление — правка указателей, чтение в обе стороны); наверху — B+tree: промежуточные узлы не хранят данные (лучше кэшируется сама структура), листья связаны → index scan одним линейным проходом; логарифмическая магия: при ветвлении M=5 высота 3 покрывает 125 листьев, высота 9 — уже 1.95 млн (M^N), поэтому поиск почти мгновенен при гигантских данных. Транзакции: ACID по определениям; между BEGIN и COMMIT — COMMIT (персистим) или ROLLBACK (откатываем). Три read phenomena: dirty read (видим незакоммиченное), non-repeatable read (два чтения в транзакции дают разные значения одной строки — строку закоммитили и изменили между чтениями), phantom read (агрегат: между чтениями появились/исчезли строки диапазона). Замки по уровням: сериализация БД → таблица → строка → range locks (блокируют вставку/изменение в диапазоне — лечат фантомы). Четыре уровня изоляции SQL-стандарта: READ UNCOMMITTED (dirty-чтения — «кошмар»), READ COMMITTED (каждое чтение — свой снапшот закоммиченного; возможны фантомы), REPEATABLE READ (снапшот от первого чтения на всю транзакцию; защищает от dirty и non-repeatable; транзакции держать короткими), SERIALIZABLE (запросы по одному; нужны ретраи; на нём строятся новые распределённые БД — пример CockroachDB). Важная оговорка автора: определения уровней в конкретных СУБД различаются — читайте документацию своей продакшен-БД.
Что брать на секцию. - B+tree за 3 фразы (данные только в листьях, листья связаны, логарифмический рост) — ответ на «почему индекс ускоряет чтение и что платим?» — бриф 04/KB §3. - Матрица «phenomenon × isolation level» — самая спрашиваемая часть брифа 09 после CAP: уметь назвать все три явления и какой уровень от чего защищает. Про деньги (платежи) — SERIALIZABLE/REPEATABLE READ + короткие транзакции; про ленты — READ COMMITTED достаточно. - Оговорка «в разных СУБД уровни реализованы по-разному (например, Postgres REPEATABLE READ — это снапшот-изоляция)» — звучит как зрелость; для глубины — DDIA гл. 8 (KB §12). - Range locks — мостик к «как БД защищает агрегаты»: блокировка диапазона запрещает вставки внутрь.
3.4 Load Balancers (2022-11-02) — карточка «первый горизонтальный шаг»
Выжимка. LB появляется, когда один сервер не тянет: роутит трафик по пулу серверов; с одним сервером сайт лежит при его падении, минимум два. Алгоритмы распределения: Round Robin (по очереди), IP Hashing (клиент приколочен к серверу — для session persistence), Least load (наименее загруженному по числу соединений). Дивиденды: меньше даунтайма, масштабируемость, redundancy, flexibility, efficiency. Уровни: L4 действует на транспортном/сетевом (IP, TCP), L7 видит прикладной слой (HTTP) — умеет, например, отводить трафик на новый сервис; авторский любимый пример — Strangler Pattern: фасад перед старой системой, за фасадом постепенно вырастают замены, вызовы переносятся на новые сервисы, старые «задушиваются». Failover: LB знает здоровье серверов и быстро выводит плохие из пула, без дырок в сервисе.
Что брать на секцию. - Минимум для брифа 03: LB в схеме ленты — L4/L7, алгоритмы и когда какой (IP hash — если сессии; least connections — при неравномерных запросах; round robin — базовый). - Strangler — готовый ответ на «как мигрируете монолит на сервисы без остановки»: фасад на L7, переносим по фичам. Отлично стыкуется со статьёй про монолит/микросервисы (§3.5). - Health checks + автоисключение нод — первый кирпич блока отказоустойчивости (KB §9): «что будет при падении app-сервера?» — «LB выведет его из пула».
3.5 Monoliths, Service Architecture, and Microservices (2022-08-27) — гранулярность: короткая, но стратегическая
Выжимка. Три уровня гранулярности с честными плюсами/минусами. Монолит: всё в одном юните; проще и быстрее в начале, производителен, меньше кросс-функциональных проблем; минус — с ростом сложности падает ловкость изменений. Вердикт автора: «большинство систем должно остаться монолитом — respect the monolith». SOA: слабо связанные полноценные юниты, часто с общей БД; лучше границы и тестируемость, команды параллелятся; минус — время отклика системы, координация и планирование заранее. Микросервисы: ещё мельче — одна ответственность + своя граница данных; проще разрабатывать/тестировать сервис, команды подвижнее; минус — вся сложность распределённых систем, деплой и эксплуатация многих юнитов; таких систем с соответствующими проблемами немного. Стратегическая мораль: заранее не знаешь, что станет самым горячим местом; миграции случаются больше одного раза — или ни разу.
Что брать на секцию. - На старте кейса (бриф 11) — оправдать уровень гранулярности: «начали бы с модульного монолита, выделили бы fan-out/медиа/чат по мере роста» — это трейдофф-мышление, которое ценится выше «нарисуем 20 микросервисов». - Границы: SOA = общая БД, микросервисы = данные на сервис — распространённый вопрос-ловушка «можно ли микросервисам ходить в чужую БД?» - Связка со strangler (§3.4): миграция монолита — не событие, а процесс; фраза «миграции случаются больше одного раза или ни разу» — хорошая финальная реплика про эволюцию архитектуры.
4. Второй эшелон (бесплатные, по темам)
| Пост | Дата | Тема | Зачем |
|---|---|---|---|
| 12 Factor App Revisited | 2022-10-06 | эксплуатация (бриф 12) | Прогон 12 факторов глазами 2022: stateless-процессы и состояние в backing services (основа горизонтального масштабирования — бриф 03), разделение build/release/run (безопасный rollback), конфиг в окружении → Vault. Читать по диагонали, брать факторы processes и build-release-run |
| Types of Encryption | 2022-08-30 | безопасность | Симметричное/асимметричное/хеши; в бриф не входит — только если интервьюер сам спросит про TLS/хранение паролей |
| Arc Note: Datasette — Simon Willison | 2022-05-27 | интервью | Разговор с создателем Datasette, соавтором Django; для секции не нужно |
| Capture the Flag | 2022-12-30 | анонс CTF | Пропустить |
5. Платная серия (подписка не обязательна)
Все платные темы перекрываются нашими бесплатными материалами; таблица — на случай, если подписка уже есть.
| Пост (платно) | Тема | Чем закрыто бесплатно у нас |
|---|---|---|
| Fallacies of Distributed Systems (2022-06-04) | 8 заблуждений распределённых систем | Классика, пересказана в KB §9 и DDIA-карте (KB §12, гл. 9); список fallacies легко нагуглить |
| Latency (2022-09-01) | латентность по уровням памяти/сети | lsd-interactive-latency.md (45.25) + KB §1 |
| Quorums (2022-10-01) | кворумы и консенсус | KB §5/§7 + DDIA гл. 8–9; плюс кворум сентинелов разобран в §3.1 этого конспекта |
| Circuit Breakers (2022-12-20) | предохранители | KB §9 + статья 08 (бриф 08); паттерн в свободном доступе описан во множестве источников |
| Locking and Contention (2023-01-10) | блокировки | База покрыта §3.3 этого конспекта; глубина — DDIA гл. 8 |
| Virtualization Explained (2022-11-13) | виртуализация/контейнеры | Вне брифа; IaC/инфраструктура в нашем профиле закрыта другим опытом |
| Types of Memory (2022-09-03) | типы памяти | KB §1 (числа латентностей) достаточно |
| Technical Debt (2023-01-26) | техдолг | Не для секции |
6. Как использовать перед слотами
- Карточки глубины (§3.1–3.4). По 20–30 минут: Redis, шардирование, RDBMS, LB — на каждый уметь своими словами выжимку «что брать на секцию». Это слой ответов на уточняющие вопросы, которых нет в учебниках уровня Alex Xu.
- Три готовых реплики-маркера: «решардинг без даунтайма — двигаем hashslot'ы, а не ключи» (Redis Cluster), «прежде чем шардировать: вертикаль → реплики → спец-хранилища» (§3.2), «миграции случаются больше одного раза или ни разу» (§3.5).
- §3.5 + strangler (§3.4) — заготовка начала кейса (бриф 11): уровень гранулярности и план эволюции архитектуры вместо «микросервисы сразу».
- Чего на сайте нет и куда идти: сквозной фреймворк и тайминг —
../methodology.md§2; банк реальных кейсов с цифрами —lsd-bytebytego-blog.md(материал 12); глубина по хранению — DDIA-карта (KB §12); эталонные разборы под наш тайминг —../classic-designs.md.
Связанные документы
../knowledge-base.md— §3 (классы хранилищ), §4 (кэш), §5 (репликация), §6 (шардирование), §7 (консистентность), §9 (отказоустойчивость)../brief.md— разделы 03 (масштабирование), 04 (модели данных), 05 (репликация/шардирование), 06 (кэш), 09 (согласованность), 11 (эталонные архитектуры)lsd-bytebytego-blog.md— материал 12: банк кейсов (Facebook/Memcached, Instagram) — парный к этому по кэшуlearn-system-design-index.md— индекс подборки (этот материал — №15, P3)