Перейти к основному содержимому

System Design. Обзор

System Design (системный дизайн) — процесс проектирования архитектуры системы

  • направлен на удовлетворение бизнес-целей, пользовательских требований и технических ограничений
  • это конкретное техническое решение, переход от требований к архитектуре
  • детализирует, как именно система будет работать, но не определяет стратегию на уровне всей компании и не описывает бизнес-цели

Уровни системного дизайна​

  • высокоуровневый дизайн (High-Level Design, HLD): общая архитектура системы, взаимодействие между компонентами, выбор технологий и структурирование сервисов
  • низкоуровневый дизайн (Low-Level Design, LLD): детализированная информация о компонентах системы (БД, API, структура данных и тд)

Основные принципы​

Масштабируемость​

Проектирование системы с учётом возможности увеличения нагрузки без снижения производительности. Это подразумевает выбор архитектуры, способной поддерживать как горизонтальное (добавление новых серверов), так и вертикальное (увеличение ресурсов существующих серверов) масштабирование. Важно предусмотреть механизмы распределения нагрузки и оптимизации обработки данных, чтобы система могла адаптироваться к росту пользователей и объёма информации.

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

Отказоустойчивость​

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

Пример: Использование репликации базы данных, где при сбое основной БД автоматически активируется резервная копия, обеспечивает непрерывность работы и доступность данных.

Скорость и производительность​

Оптимизация времени отклика и эффективности обработки данных, что критично для удовлетворения ожиданий пользователей. Этот принцип включает выбор эффективных алгоритмов, оптимизацию запросов к БД, использование кэширования и распределённой обработки. Производительность напрямую влияет на масштабируемость и пользовательский опыт.

Пример: Применение кэширования с помощью Redis позволяет снизить нагрузку на базу данных и ускорить обработку запросов, что ведёт к более быстрому отклику системы.

Модульность​

Деление системы на независимые компоненты, каждый из которых отвечает за определённую функциональность. Модульная архитектура облегчает разработку, тестирование и обновление отдельных частей системы без необходимости остановки всего сервиса. Это также способствует повторному использованию компонентов и повышает гибкость при внесении изменений.

Пример: Микросервисная архитектура, где каждая служба, например, для авторизации или управления товарами, разрабатывается и развёртывается независимо, что позволяет проводить обновления без влияния на всю систему.

Балансировка нагрузки​

Распределение входящего трафика между несколькими серверами или компонентами для равномерного использования ресурсов. Балансировка нагрузки помогает избежать перегрузок, улучшает отзывчивость системы и повышает её отказоустойчивость. Это особенно важно в условиях высоких пиковых нагрузок и больших объёмов данных.

Пример: CDN серверы автоматически распределяют нагрузку, направляют пользователей к ближайшему серверу с кэшем.

Безопасность​

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

Пример: Реализация шифрования данных в REST API с использованием HTTPS, а также применение механизмов защиты от SQL-инъекций, XSS и CSRF, гарантирует надёжную защиту информации.

Мониторинг​

Непрерывное наблюдение за состоянием системы для своевременного обнаружения и устранения проблем. Эффективный мониторинг включает сбор метрик, логирование и настройку оповещений, что позволяет быстро реагировать на изменения в производительности или сбои в работе системы. Это помогает поддерживать высокий уровень доступности и качества сервиса.

Пример: Использование инструментов мониторинга, таких как Prometheus или Grafana, для сбора и визуализации метрик, помогает оперативно выявлять узкие места и оптимизировать работу системы.

Системный дизайн vs архитектура​

Системный дизайн — детальное проектирование, включая конкретные компоненты (БД, очереди сообщений, API). "Как именно это построить?"

Архитектура — высокоуровневое описание системы, основные компоненты, их роли и взаимосвязи

"Что строим?"

Основные вопросы системного дизайна​

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

Краткий пример системного дизайна​

Задача: создать масштабируемую систему для загрузки и хранения изображений

  1. Сбор требований:

    • максимальный размер изображения — 5 МБ
    • 10 000 пользователей, 100 загрузок в секунду
    • сохранение резервных копий
  2. Решение:

    • API-шлюз: принимаем запросы на загрузку
    • балансировщик нагрузки (Layer 7): распределяем запросы между серверами загрузки
    • серверы хранения: храним изображения в S3-совместимом объектном хранилище (например, MinIO)
    • Кэш: используем CDN (Cloudflare) для ускорения
    • Очереди сообщений: RabbitMQ для обработки изображений (ресайзинг)
    • БД: метаданные изображений сохраняем в реляционной БД (PostgreSQL)

Кто проектирует? Какова роль аналитика?​

Проектированием занимаются архитекторы, инженеры и разработчики

Роль аналитика:

  • формулирует и уточняет требования для понимания всеми участниками
  • участвует в выборе архитектурных решений, оценивает их с точки зрения соответствия бизнес-целям
  • определяет ограничения системы (временные, технические, финансовые)

Для участия в системном дизайне, аналитику следует:​

Понимать​

Уметь​

  • работать с инструментами: UML и BPMN для визуализации архитектурных решений
  • разрабатывать схемы взаимодействий (sequence diagrams) и ER-диаграммы БД

Материалы​

  1. Что такое System design?
  2. Что такое System Design. Пример System Design для онлайн-магазина, для мобильного приложения
  3. System Design для начинающих: всё, что вам нужно
  4. System design. Реальный проект vs Интервью
  5. System Design. Общие принцип прохождения интервью по проектированию ИТ-систем
  6. 50 терминов системного дизайна
  7. System Design 101
  8. Собеседование по System Design: как запроектировать и не потеряться
  9. Публичное System Design Interview на конференции ArchDays 2022
  10. РазработкаПроектируем системный дизайн Spotify
  11. Как подготовиться и пройти System Design Interview

Видео​

  1. Роль аналитика в процессе создания сложных информационных систем • Романов Борис
  2. Цикл видео: Конференция Systems Design 24
  3. Александр Поломодов — Дизайн секции как проверка навыков проектирования систем на собеседованиях
  4. Архитектура и системный дизайн — КИТ 2024
  5. System Design с Валерием Бабушкиным | Выпуск 3 | Собеседование | karpov.courses

Книги​

  1. System Design. Общие принцип прохождения интервью по проектированию ИТ-систем
  2. Высоконагруженные приложения. Программирование, масштабирование, поддержка — Мартин Клеппман
  3. Распределенные системы. Паттерны проектирования -- Брендан Бернс
  4. Архитектура программного обеспечения на практике — Л. Басс, П. Клементс, Р. Кацман
  5. Александр Швец. Погружение в Паттерны Проектирования
  6. Разработка высоконагруженных систем — очень полезная брошюра по материалам конференции HighLoad++