План проектирования системы (System Design Outline)

Перевод и адаптация этого репозитория https://github.com/jguamie/system-design/blob/master/notes/system-design-outline.md

Это рекомендуемый подход к решению задач проектирования систем. Не все эти темы будут актуальны для конкретной задачи.

  1. Функциональные требования / Уточнения / Предположения (Functional Requirements / Clarifications / Assumptions)
  2. Нефункциональные требования (Non-Functional Requirements)
    1. Согласованность vs Доступность (Consistency vs Availability)
    2. Задержка (Latency)
      1. Насколько быстрой должна быть эта система?
      2. Задержка, воспринимаемая пользователем (User-perceived latency)
      3. Задержка обработки данных (Data processing latency)
    3. Безопасность (Security)
      1. Потенциальные атаки? Как их следует смягчать?
    4. Конфиденциальность (Privacy)
      1. PII (Personally Identifiable Information — Персональные данные, позволяющие идентифицировать личность), PCI (Payment Card Industry — Индустрия платежных карт) или другие пользовательские данные
    5. Целостность данных (Data Integrity)
      1. Как восстановиться после повреждения или потери данных?
    6. Соотношение чтения:записи (Read:Write Ratio)
  3. API (Application Programming Interface — Интерфейс программирования приложений)
    1. Публичные и/или внутренние API?
    2. Просты ли API для понимания?
    3. Как идентифицируются сущности?
  4. Схемы хранения (Storage Schemas)
    1. SQL (Structured Query Language — Язык структурированных запросов) vs NoSQL (Not Only SQL — Не только SQL, обозначает нереляционные базы данных)
    2. Очереди сообщений (Message Queues)
  5. Проектирование системы (System Design)
  6. Масштабируемость (Scalability)
    1. Как масштабируется система? Учитывайте увеличение как объема данных, так и трафика.
    2. Каковы узкие места? Как их следует устранять?
    3. Каковы граничные случаи? Что может пойти не так? Предполагая, что они произойдут, как их следует решать?
    4. Как мы будем проводить стресс-тестирование этой системы?
    5. Балансировка нагрузки (Load Balancing)
    6. Автомасштабирование / Репликация (Auto-scaling / Replication)
    7. Кэширование (Caching)
    8. Партиционирование (Partitioning)
    9. Репликация (Replication)
    10. Непрерывность бизнеса и аварийное восстановление (BCDR — Business Continuity and Disaster Recovery)
    11. Интернационализация / Локализация (Internationalization / Localization)
      1. Как масштабироваться на несколько стран и языков? Не предполагайте, что в США используется только английский язык.