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

Способы обеспечения работы высоконагруженных систем

Сгруппируем методы поддержания высокопроизводительных систем по слоям архитектуры фреймворка TOGAF.

1. Инфраструктура

  • Вертикальное масштабирование — увеличение производительности серверов (увеличение RAM, добавление дисков, более мощных CPU и т.д.). Самый простой способ, однако он довольно быстро упирается в потолок.
  • Горизонтальное масштабирование — добавление дополнительных серверов (или виртуальных копий сервиса — реплик) для распределения нагрузки между ними. Это работает примерно так же, как в реальной жизни: если один рабочий выкопает яму за 4 часа, то двое рабочих сделают это быстрее (но не факт, что в 2 раза).
  • Балансировка нагрузки — актуально при горизонтальном масштабировании, когда используется несколько серверов или реплик приложения. Балансировка помогает распределить загрузку между сервисами равномерно.

2. Хранение и доступ к данным

  • Кэширование — сохранение часто запрашиваемых данных в памяти для быстрого доступа. Подробнее см. в этом посте.
  • Индексы — дополнительная структура данных в реляционных БД для ускорения поиска и обработки записей. Это подобно алфавитному указателю в англо-русском словарике: не нужно листать весь словарь, достаточно лишь открыть страницы с нужным сочетанием букв. Подробнее в этом посте.
  • Денормализация — введение избыточности в таблицах и представлениях, чтобы сократить число запросов к БД и тем самым минимизировать время обработки запросов. Вместо того, чтобы делать кучу джойнов с группировками и вычисляемыми полями, можно завести представление (вью), которая будет содержать все нужные данные, хотя она не будет соблюдать 3 нормальных формы.
  • Репликация — копирование одних и тех же данных между разными серверами. При использовании такого метода выделяют два типа серверов: master и slave. Мастер используется для записи или изменения информации, слейвы — для копирования информации с мастера и её чтения. Эффект достигается за счёт повышения отказоустойчивости и разделения операций чтения и записи.
  • Партиционирование — разделение таблиц на несколько частей в рамках одного сервера. Позволяет увеличить производительность за счёт уменьшения объема данных, которые нужно обрабатывать при выполнении запросов. Подробнее тут.
  • Шардирование — техника масштабирования БД, когда данные разносятся по нескольким машинам. Разделение данных эффективно, когда для разных запросов требуются разные данные некогда единой таблицы. Подробнее тут.

3. Приложения

Проектирование архитектуры приложений

  • DDD (Domain-Driven Design) — подход к проектированию архитектуры, при котором приложение разделяется на функциональные домены на основе того, как работает реальный бизнес. DDD помогает создавать более устойчивые и масштабируемые системы. Подробнее в этом посте.
  • CQRS (Command Query Responsibility Segregation) — подход, при котором система разделяется на две части: одна отвечает за обработку команд (изменения состояния), а другая — за запросы (чтение данных). Команды и запросы могут быть масштабированы независимо, что позволяет системе более эффективно обрабатывать большое количество RPC. Подробнее в этом посте.
  • CDC (Change Data Capture) — техника, используемая для определения и отслеживания изменений в данных. Очень полезно, когда нужно в режиме реального времени реагировать на изменения в базе-источнике. Подробнее здесь.

Интеграции

  • Брокеры сообщений — помогают обрабатывать тысячи запросов с гарантией доставки сообщений. Подробнее тут.
  • Использование gRPC — более производительный стиль интеграции, который под капотом использует HTTP/2 для транспорта и Protocol Buffers для сериализации данных. В этом посте подробнее.
  • Веб-сокеты — вместо множества запросов для обновления данных, веб-сокеты позволяют поддерживать постоянное соединение, через которое данные могут передаваться в обе стороны в реальном времени. Подробнее здесь.

Оптимизация кода

  • Распараллеливание запросов
  • Минимизация сериализации данных
  • Оптимизация запросов к БД
  • Управление HTTP-сессиями и использование возможностей TCP

Подборка материалов про high-load

Общие статьи

  1. Чеклист для HighLoad системы гуглить будешь
  2. Повышение производительности через оптимизацию кода
  3. 5 правил проектирования highLoad-систем
  4. Высоконагруженные интернет-проекты
  5. Основные принципы архитектуры высоконагруженных веб-приложений
  6. Архитектурные ловушки и распространенные ошибки при проектировании высоконагруженных систем
  7. Тестирование производительности высоконагруженных систем
  8. Шаблоны проектирования Cloud-based и микросервисных приложений

Статьи практика

  1. Как департамент утилизации CPU превратился в департамент экономии железа, выдерживающий нагрузку в 1 млн RPS
  2. Пережить распродажу на Ozon: хайлоад, сковородки и 38 инфарктов
  3. Разработка высоконагруженных проектов для начинающих — простые советы на пальцах
  4. Как мы отказались от JPEG, JSON, TCP и ускорили ВКонтакте в два раза
  5. Как построить систему, способную выдерживать нагрузку в 5 млн rps
  6. Опыт использования gRPC в Почте Mail.ru
  7. Разгоняем обработку событий до 1,6 миллионов в секунду
  8. Архитектура растущего проекта на примере ВКонтакте
  9. Picodata: простое масштабирование Tarantool
  10. Оптимизация базового поиска Озон

Видео

  1. Лекции Технопарка. 3 семестр. Проектирование высоконагруженных систем
  2. Плейлист по HighLoad — Олег Бунин. Лекторий ФПМИ
  3. Проектирование и запуск высоконагруженной веб-системы в условиях жесточайшего цейтнота — доклад Александра Сербула на конференции Analyst Days-13
  4. Архитектура высоконагруженных систем — краткий обзор основных приёмов масштабирования от Ани Крх
  5. Архитектура масштабирования: ускоряем обработку и повышаем доступность данных — доклад Сергея Харламова (VK) на конференции ArchDays 2022
  6. Проектирование высоконагруженных приложений — доклад Евгения Клокова (БАРС груп)
  7. Архитектура распределенных систем — школа бэкенд разработки Яндекса
  8. Точки отказа в хайлоад системах. Backend

Конференция

HighLoad++ — доклады по архитектуре и проектированию высоконагруженных систем

Книги

  1. 🐗 Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка
  2. Разработка высоконагруженных систем — очень полезная брошюра по материалам конференции HighLoad++