System Design Space

    Глава 91

    Обновлено: 16 февраля 2026 г. в 03:00

    Designing Data-Intensive Applications (short summary)

    Прогресс части0/21

    Designing Data-Intensive Applications (Высоконагруженные приложения. Программирование, масштабирование, поддержка)

    Авторы: Martin Kleppmann
    Издательство: O'Reilly Media, 2017 (1-е издание), 2025 (2-е издание)
    Объём: 616 страниц

    Разбор книги Martin Kleppmann: модели данных, репликация, партиционирование, транзакции, batch и stream processing.

    Designing Data-Intensive Applications — оригинальная обложкаОригинал
    Высоконагруженные приложения. Программирование, масштабирование, поддержка — переводПеревод

    Структура книги

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

    Часть I: Основы

    Модели данных, хранение, кодирование. Как данные представляются и записываются на диск.

    Часть II: Распределённые данные

    Репликация, партиционирование, транзакции, консенсус. Масштабирование на несколько машин.

    Часть III: Производные данные

    Batch и stream processing. Построение пайплайнов обработки данных.

    Часть I: Основы систем данных

    Глава 1-2: Надёжность, масштабируемость и модели данных

    Три столпа системы:

    • Reliability — система работает корректно даже при сбоях
    • Scalability — способность справляться с ростом нагрузки
    • Maintainability — простота поддержки и изменений

    Модели данных:

    • Реляционная — таблицы, SQL, ACID
    • Документная — JSON, вложенность, гибкость
    • Графовая — узлы и рёбра, связи любой сложности

    Глава 3: Хранение и извлечение данных

    Одна из ключевых глав книги — как данные физически хранятся на диске.

    LSM-Tree (Log-Structured Merge)

    • Оптимизирован для записи
    • Используется в Cassandra, RocksDB, LevelDB
    • Memtable → SSTable → Compaction

    B-Tree

    • Оптимизирован для чтения
    • Используется в PostgreSQL, MySQL, Oracle
    • Страницы фиксированного размера, update-in-place

    Глава 4: Кодирование и эволюция схем

    Как сериализовать данные и обеспечить обратную/прямую совместимость:

    JSON/XML

    Человекочитаемые, большой размер

    Thrift/Protocol Buffers

    Бинарные, со схемой

    Avro

    Schema evolution, Hadoop-friendly

    Часть II: Распределённые данные

    Глава 5: Репликация

    Single-Leader

    • Один мастер для записи
    • Простая модель
    • Проблема: single point of failure

    Multi-Leader

    • Несколько мастеров
    • Для мульти-датацентров
    • Проблема: конфликты записи

    Leaderless

    • Все ноды равны (Dynamo-style)
    • Quorum reads/writes
    • W + R > N для консистентности

    Глава 6: Партиционирование (Sharding)

    Стратегии партиционирования:

    • По ключу — hash(key) mod N
    • По диапазону — временные данные, географические
    • Consistent Hashing — минимизация перебалансировки

    Проблемы:

    • Hot spots — неравномерная нагрузка
    • Scatter-gather — запросы ко всем шардам
    • Rebalancing — перераспределение данных

    Глава 7: Транзакции

    Глубокий разбор ACID и уровней изоляции — одна из сильнейших частей книги:

    Уровень изоляцииЗащищает отНе защищает от
    Read CommittedDirty reads, dirty writesNon-repeatable reads
    Snapshot IsolationNon-repeatable readsWrite skew
    SerializableВсе аномалии

    Главы 8-9: Проблемы и консенсус

    Что может пойти не так:

    • Сетевые разделения (network partitions)
    • Асимметричные сбои (partial failures)
    • Проблемы с часами (clock skew)
    • Byzantine faults

    Алгоритмы консенсуса:

    • Paxos — классический, сложный
    • Raft — понятный, используется в etcd
    • Zab — ZooKeeper
    • FLP impossibility theorem

    Часть III: Производные данные

    Глава 10: Batch Processing

    Unix философия:

    Kleppmann проводит параллель между Unix pipes и современным batch processing:

    cat log.txt | grep ERROR | sort | uniq -c

    MapReduce и его эволюция:

    • MapReduce — простая модель, много I/O
    • Spark — in-memory, DAG execution
    • Flink — unified batch/stream

    Глава 11: Stream Processing

    Обработка данных в реальном времени — ключевая тема для современных систем:

    Message Brokers

    Kafka, RabbitMQ, Pulsar

    Event Sourcing

    Immutable event log как источник правды

    Change Data Capture

    Debezium, Maxwell

    Глава 12: Будущее систем данных

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

    • Композицию сервисов и data flow
    • End-to-end correctness гарантии
    • Этические аспекты обработки данных

    Ключевые концепции для System Design Interview

    DDIA не содержит готовых решений задач, но даёт глубокое понимание, которое позволяет уверенно отвечать на вопросы «почему?»:

    Выбор базы данных

    Понимание trade-offs между SQL и NoSQL, LSM vs B-Tree

    Стратегии репликации

    Когда использовать синхронную vs асинхронную репликацию

    Партиционирование

    Выбор partition key, избежание hot spots

    Уровни изоляции

    Объяснение аномалий и их предотвращение

    Exactly-once semantics

    Идемпотентность и дедупликация в stream processing

    Консенсус

    Понимание Raft/Paxos для distributed locking

    📚 Вердикт

    ✅ Сильные стороны

    • Глубокое понимание «почему», а не только «как»
    • Отличные визуализации и примеры
    • Охват всего стека: от байтов до бизнес-логики
    • Множество ссылок на реальные системы
    • Честное обсуждение trade-offs

    ⚠️ Особенности

    • Объёмная книга (~600 страниц)
    • Нет готовых решений для интервью
    • Требует времени на усвоение
    • Некоторые разделы могут быть слишком академичными

    🎯 Рекомендация:

    DDIA — это must-read для любого инженера, работающего с распределёнными системами. Для подготовки к интервью используйте её вместе с практическими книгами (Alex Xu, Stanley Chiang) — DDIA даст понимание «почему», а практические книги — «как».

    Где найти книгу