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

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++