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

freeCodeCamp.org 2,7 млн 53 мин 5 мин 25.07.2024
Главное

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

💻 Анатомия компьютера и хранение данных 0:39

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

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

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

🚀 Архитектура промышленного приложения 4:22

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

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

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

⚖️ Принципы проектирования и CAP-теорема 7:12

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

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

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

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

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

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

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

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

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

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

🔌 Проектирование API 24:01

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

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

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

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

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

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

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

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

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

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

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

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

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

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

💬 Цитаты

«Интервью по системному дизайну мало связано с кодингом; люди хотят видеть, как вы склеиваете всю систему воедино.»

Айк Симонян 00:25

«Золотое правило: никогда не занимайтесь отладкой непосредственно в производственной среде.»

Айк Симонян 06:41
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
CAP-теорема
Принцип, согласно которому распределенная система может обеспечить только два из трех свойств: согласованность, доступность и устойчивость к разделению.
Шардирование
Метод горизонтального масштабирования базы данных путем разделения данных на несколько независимых частей, хранящихся на разных серверах.
Реверс-прокси
Сервер, который принимает запросы из интернета и перенаправляет их на один из внутренних серверов, скрывая их структуру от клиента.
📊 Цифры
⚖️ Другая сторона
Технологии и IT System Design CAP-теорема Load Balancing CI/CD Sharding