Designing Data-Intensive Applications (Высоконагруженные приложения. Программирование, масштабирование, поддержка)
Авторы: Martin Kleppmann
Издательство: O'Reilly Media, 2017 (1-е издание), 2025 (2-е издание)
Объём: 616 страниц
Разбор книги Martin Kleppmann: модели данных, репликация, партиционирование, транзакции, batch и stream processing.
Оригинал
ПереводСтруктура книги
Книга разделена на три части, каждая из которых последовательно увеличивает масштаб рассмотрения — от одной машины до глобальных распределённых систем:
Часть 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 Committed | Dirty reads, dirty writes | Non-repeatable reads |
| Snapshot Isolation | Non-repeatable reads | Write 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 -cMapReduce и его эволюция:
- 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 даст понимание «почему», а практические книги — «как».
