# Системный дизайн: как пройти интервью и спроектировать отказоустойчивое приложение

Источник: https://www.youtube.com/watch?v=F2FmTdLtb_4
Канал: freeCodeCamp.org
Опубликовано: 25.07.2024

---

Айк Симонян разработал курс по системному проектированию для подготовки к техническим интервью на платформе freeCodeCamp.org. Он утверждает: на собеседованиях работодатели оценивают не навыки написания кода, а умение соединять компоненты в отказоустойчивую структуру [0:25]. Основное внимание в обучении уделяется масштабируемости, надежности и методам обработки данных.

## 💻 Анатомия компьютера и хранение данных
[[JUMP:00:39]]

Компьютеры оперируют битами и байтами для представления символов и чисел. Для хранения информации используются дисковые накопители HDD или SSD [1:18]. Дисковая память является энергонезависимой и сохраняет данные после перезагрузки ОС. SSD обеспечивают скорость чтения от 500 до 3500 МБ/с, тогда как HDD выдают лишь 80–160 МБ/с [2:01].

Оперативная память (RAM) служит временным хранилищем для активных процессов и переменных [2:15]. Это волатильная память: данные исчезают при отключении питания. Скорость чтения RAM превышает 5000 МБ/с, что значительно быстрее самых производительных SSD [2:54].

Для еще большего ускорения работы CPU использует кэш-память уровней L1, L2 и L3. Доступ к кэшу L1 занимает всего несколько наносекунд [3:07]. Процессор сначала ищет данные в кэше, затем в RAM и только потом обращается к диску [3:21]. Весь обмен данными между компонентами обеспечивает материнская плата.

## 🚀 Архитектура промышленного приложения
[[JUMP:04:22]]

Современный цикл разработки опирается на конвейер CI/CD. Платформы Jenkins или GitHub Actions автоматизируют тестирование и развертывание кода без ручного вмешательства [04:39]. Входящий трафик распределяют балансировщики нагрузки и реверс-прокси, такие как Nginx [4:52].

Система мониторинга отслеживает каждое микро-взаимодействие компонентов. Для сбора логов на бэкенде применяется инструмент PM2, а на фронтенде ошибки фиксирует Sentry [5:46]. При обнаружении аномалий сервисы оповещения отправляют уведомления в Slack [6:14].

Процесс исправления ошибок включает несколько этапов:

*   Идентификация проблемы через анализ паттернов в логах.
*   Репликация бага в изолированной тестовой среде (Staging).
*   Запрет на отладку непосредственно в производственной среде (Production).
*   Выпуск хотфикса — временного патча для восстановления работоспособности [7:08].

## ⚖️ Принципы проектирования и CAP-теорема
[[JUMP:07:12]]

Качественная архитектура базируется на трех столпах: масштабируемости, удобстве обслуживания и эффективности [7:34]. Проектирование системы сводится к управлению тремя процессами: перемещением, хранением и трансформацией данных [8:01].

Эрик Брюэр сформулировал CAP-теорему для распределенных систем [8:52]. Она утверждает, что одновременно можно достичь только двух из трех свойств:

*   **Согласованность (Consistency):** все узлы содержат одинаковые данные в один момент времени.
*   **Доступность (Availability):** система всегда отвечает на запросы.
*   **Устойчивость к разделению (Partition Tolerance):** система работает при сбоях связи между узлами.

Банковские системы жертвуют доступностью ради согласованности данных при сбоях [10:24]. Высокая доступность часто измеряется «пятью девятками» (99,999%). Это означает, что простой системы составит не более пяти минут в год [11:31].

## 🌐 Сетевые протоколы и уровни связи
[[JUMP:14:40]]

Каждое устройство в сети идентифицируется IP-адресом. Формат IPv4 использует 32 бита и предоставляет около 4 миллиардов адресов [14:49]. Переход на IPv6 со 128-битными адресами решает проблему дефицита уникальных идентификаторов.

На транспортном уровне работают протоколы TCP и UDP. TCP гарантирует доставку пакетов через механизм «трехстороннего рукопожатия» [16:34]. UDP работает быстрее, но допускает потерю данных, что подходит для видеозвонков и стриминга [16:48].

Система доменных имен (DNS) переводит понятные человеку имена сайтов в IP-адреса. Работу DNS координирует организация ICANN [17:28]. Записи типа «A» сопоставляют домен с IPv4, а «AAAA» — с IPv6 [17:54]. Для защиты сетей применяются брандмауэры (firewalls), контролирующие входящий и исходящий трафик.

## 🛠 Протоколы прикладного уровня
[[JUMP:19:03]]

HTTP является протоколом без сохранения состояния (stateless). Каждый запрос автономен и содержит заголовки с метаданными [19:24]. Коды ответов сервера делятся на группы: 200 (успех), 300 (перенаправление), 400 (ошибка клиента) и 500 (ошибка сервера) [19:50].

Для специфических задач используются другие протоколы:

*   **WebSockets:** обеспечивают двустороннюю связь для чатов и котировок акций [20:43].
*   **SMTP:** стандарт для передачи электронной почты между серверами [21:11].
*   **WebRTC:** позволяет браузерам обмениваться голосом и видео напрямую [22:28].
*   **MQTT:** легковесный протокол для устройств интернета вещей (IoT) [22:41].
*   **gRPC:** разработан Google, использует Protocol Buffers для эффективной передачи данных [26:57].

## 🔌 Проектирование API
[[JUMP:24:01]]

Хороший API четко определяет входные и выходные параметры для операций CRUD [24:40]. В парадигме REST для создания данных используется метод POST, для получения — GET, для обновления — PUT или PATCH [25:06]. REST-интерфейсы обычно передают данные в формате JSON.

GraphQL позволяет клиенту запрашивать строго необходимые поля, избегая избыточности данных [26:29]. При изменении структуры API важно сохранять обратную совместимость. Распространенная практика — введение версионности (например, `/v2/products`) [28:19]. Для защиты от атак типа DoS устанавливаются ограничения скорости (rate limits) [28:57].

## ⚡️ Кэширование и CDN
[[JUMP:29:19]]

Кэширование снижает задержку и нагрузку на сервер. Данные могут храниться в браузере пользователя, на сервере или в промежуточных слоях [30:01]. Заголовок `Cache-Control` определяет время актуальности контента [30:40].

Существуют разные стратегии записи в кэш:

*   **Write-around:** данные пишутся сразу в хранилище, минуя кэш.
*   **Write-through:** данные записываются одновременно в кэш и в память [32:11].
*   **Write-back:** данные сначала пишутся в кэш, а в память — позже [32:25].

Сети доставки контента (CDN) распределяют статические файлы (изображения, JS, CSS) по географически удаленным серверам [34:01]. Это позволяет пользователю из Мексики загружать контент с местного узла, а не из дата-центра в Финляндии.

## 🔄 Прокси-серверы и балансировка нагрузки
[[JUMP:36:33]]

Прямой прокси (Forward Proxy) скрывает IP-адрес клиента от интернета. Обратный прокси (Reverse Proxy) защищает серверы, принимая запросы от клиентов первым [40:47]. Популярные алгоритмы балансировки нагрузки:

1.  **Round Robin:** последовательная передача запросов каждому серверу по кругу [43:02].
2.  **Least Connections:** отправка трафика на сервер с наименьшим числом активных соединений [43:14].
3.  **IP Hashing:** привязка клиента к конкретному серверу на основе хэша его IP [43:40].
4.  **Consistent Hashing:** распределение данных по «хэш-кольцу» для минимизации перераспределения при добавлении узлов [44:47].

Балансировщики бывают аппаратными (F5 Big-IP), программными (HAProxy, Nginx) и облачными (AWS ELB) [45:38].

## 🗄 Масштабирование баз данных
[[JUMP:48:05]]

Реляционные базы данных (PostgreSQL, MySQL) придерживаются принципов ACID для обеспечения целостности транзакций [49:06]. NoSQL решения (MongoDB, Cassandra) более гибки и лучше подходят для неструктурированных данных [51:13].

Для роста производительности применяют два вида масштабирования:

*   **Вертикальное (Scale Up):** увеличение мощности текущего сервера (CPU, RAM). Оно ограничено физическим пределом железа [50:54].
*   **Горизонтальное (Scale Out):** добавление новых серверов в кластер [51:08].

Метод шардирования разделяет базу данных на части (шарды) по географическому признаку или диапазону ключей [51:34]. Репликация создает копии данных на нескольких серверах для обеспечения высокой доступности [52:00]. Индексация часто используемых столбцов значительно ускоряет поиск данных [52:52].