Подходы к работе над информационными системами
Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
Главная книга для тех, кто хочет научиться создавать крупные, быстрые и надежные ИТ-системы вроде Telegram, Netflix или крупных интернет-магазинов.
Программа вечера
Антон Помазков
Артём Никифоров
Антон Помазков
Артём Никифоров
Об авторе
Мартин Клеппман
Martin Kleppmann — исследователь распределённых систем, ИТ-предприниматель, доцент Кембриджского университета
- Rapportive (2010) — плагин для Gmail: показывал профили людей из соцсетей прямо в почте. Куплен LinkedIn в 2012 ↗
- Go Test It — платформа для проверки веб-приложений в разных браузерах и на разных платформах. Куплена Red Gate Software в 2009 ↗
- После сделки несколько лет работал в LinkedIn над инфраструктурой обработки больших объёмов данных на Apache Kafka и Samza.
- Кембридж — преподаёт криптографию, распределённые системы и компьютерную безопасность; с 2024 года — Associate Professor.
- CRDT ↗Придумал не он. Конфликт-свободные реплицируемые типы данных ввели Марк Шапиро, Нуну Прегиса, Карлуш Бакеру и Марек Завирски в 2011 году. Клеппман их исследует и формально верифицирует, а справочник crdt.tech ведёт вместе с Шапиро и Аннетт Бениусой. — алгоритмы, позволяющие обновлять данные на разных устройствах одновременно без конфликтов (как в Google Документах, где текст правят несколько человек сразу).
- Automerge ↗Один из создателей. Открытый движок синхронизации для многопользовательских приложений: работает офлайн, сливает правки без конфликтов и помнит каждое изменение. — библиотека с открытым исходным кодом, на которой такие приложения и строят.
- Local-first ↗Соавтор манифеста. Эссе «Local-First Software: You Own Your Data, in spite of the Cloud» (Ink & Switch, 2019) — вместе с Адамом Уиггинсом, Питером ван Харденбергом и Марком Макгранаханом. — подход, ради которого нужны CRDT: данные лежат на устройстве и работают без интернета, но синхронизируются при сети.
- Bluesky ↗Советник и исследователь. Соавтор рецензируемой статьи об AT Protocol — открытом протоколе, на котором работает сеть (2024). — децентрализованная социальная сеть, которой он помогает как советник.
Культовый статус в мире ИТ ему принесла книга «Высоконагруженные приложения» (Designing Data-Intensive Applications): она разошлась сотнями тысяч экземпляров и стала главным учебником по архитектуре баз данных для разработчиков по всему миру.
- Объединяет сложную академическую теорию и реальную практику крупных ИТ-компаний.
- Написана понятным языком, со схемами, и не продвигает одну технологию — ни только SQL, ни только NoSQL.
- Учит мыслить компромиссами: понимать, чем мы жертвуем — скоростью, надёжностью или консистентностью данных, — выбирая тот или иной архитектурный подход.
Виды приложений
Про них книга
Высоконагруженные даннымиdata-intensive
Приложение почти ничего не вычисляет — оно хранит, ищет, обновляет и раздаёт данные. Собирается такое приложение из стандартных блоков, каждый из которых закрывает часто требующуюся функциональность.
Чистая производительность CPU — просто ограничивающий фактор. Основная проблема — объём данных, их сложность и скорость изменения.
Книга не про них
Высоконагруженные вычислениямиcompute-intensive
Данных немного, но над ними много считают. Здесь всё решает то, сколько операций нужно выполнить, а не сколько данных прочитать и записать.
Процессор: задача упирается в количество вычислений.
«Интернет настолько хорош, что большинство людей считает его природным ресурсом, таким как Тихий океан, а не чем-то сотворённым руками человека. Когда в последний раз в технологии подобного масштаба не было ни одной ошибки?» Алан Кей, из интервью Dr. Dobb’s Journal (2012) · эпиграф к главе 1
фото: Marcin Wichary, CC BY 2.0
Спойлер
Две главные мысли, которые будут раскрыты дальше.
Важна задача,
а не инструмент
Нет смысла мыслить жёсткими категориями «база данных», «кэш», «очередь». Есть потребности системы, и под каждую потребность подбирается подходящий инструмент.
Один и тот же инструмент может решать разные задачи, а разные инструменты — похожие задачи.
Разработчик —
архитектор
Современное приложение — это не один инструмент, а система из нескольких компонентов, которые нужно связать и синхронизировать.
Поэтому разработчик отвечает не только за код, но и за то, как устроена вся система, как части взаимодействуют, как она ведёт себя при сбоях и росте.
Нет «одного правильного инструмента»
Инструменты оптимизированы под разные сценарии и больше не укладываются в обычные категории — границы между категориями постепенно размываются.
SKIP LOCKED и LISTEN/NOTIFY раздаёт задачи обработчикам: обычная база работает как очередь.
Система собирается из нескольких компонентов
Требования стали такими жёсткими и широкими, что отдельная утилита уже не способна обеспечить все потребности приложения. Работа разбивается на задачи — каждую эффективно решает свой инструмент.
Эти компоненты нужно грамотно связать
Инструменты не знают друг о друге: синхронизация кэшей и индексов с основной базой данных становится обязанностью кода приложения.
Пока данные согласованы: в хранилище и в кэше одно и то же имя, клиент видит его же.
Разработчик думает как архитектор
К этому приводит простая цепочка — и вместе с ней появляются три свойства системы, о которых теперь приходится думать в первую очередь.
За что теперь отвечает разработчик
Раз мы отвечаем за систему целиком, приходится думать и о её свойствах. Из всех факторов, влияющих на конструкцию системы, в большинстве программных систем книга выделяет три — им посвящены три раздела главы и три доклада сегодняшнего вечера.
Система должна продолжать работать корректно (осуществлять нужные функции на требуемом уровне производительности) даже при неблагоприятных обстоятельствах — в случае аппаратных или программных сбоев либо ошибок пользователя.
Артём Никифоров
↗
Должны быть предусмотрены разумные способы решения возникающих при росте системы проблем — росте в смысле объёмов данных, трафика или сложности.
Антон Помазков
↗
Необходимо обеспечить возможность эффективной работы с системой множеству различных людей: разработчикам и обслуживающему персоналу, занимающимся как поддержкой текущего функционирования, так и адаптацией системы к новым сценариям применения.
Артём Никифоров
↗
Итог
Главная цепочка доклада — от инструмента к системе.
Границы между категориями размылись: Redis — хранилище в роли очереди, Kafka — очередь с надёжностью базы данных. Смотрим не на ярлык, а на задачу, которую инструмент решает в конкретной архитектуре.
Хранилище, кэш, поисковый индекс, очередь — каждый компонент закрывает свою задачу, а снаружи это один API, за которым клиент не видит подробностей реализации.
Инструменты не знают друг о друге: изменили имя в PostgreSQL — Redis остался со старым. Синхронизация — обязанность кода приложения, и цель не в том, чтобы сбоев не было, а в том, чтобы система из них корректно выходила.
Он отвечает за поведение всей системы, а книга сводит это к трём свойствам: надёжность, масштабируемость и удобство сопровождения.
![]()
Современное приложение — это не программа и не база данных, а информационная система, а разработчик — тот, кто проектирует её поведение.
вывод по главе 1 книги «Высоконагруженные приложения» Мартина Клеппмана
Что далее
Антон Помазков
Артём Никифоров
Антон Помазков
Артём Никифоров