Способы обеспечения работы высоконагруженных систем
Сгруппируем методы поддержания высокопроизводительных систем по слоям архитектуры фреймворка 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
Общие статьи
- Чеклист для HighLoad системы гуглить будешь
- Повышение производительности через оптимизацию кода
- 5 правил проектирования highLoad-систем
- Высоконагруженные интернет-проекты
- Основные принципы архитектуры высоконагруженных веб-приложений
- Архитектурные ловушки и распространенные ошибки при проектировании высоконагруженных систем
- Тестирование производительн ости высоконагруженных систем
- Шаблоны проектирования Cloud-based и микросервисных приложений
Статьи практика
- Как департамент утилизации CPU превратился в департамент экономии железа, выдерживающий нагрузку в 1 млн RPS
- Пережить распродажу на Ozon: хайлоад, сковородки и 38 инфарктов
- Разработка высоконагруженных проектов для начинающих — простые советы на пальцах
- Как мы отказались от JPEG, JSON, TCP и ускорили ВКонтакте в два раза
- Как построить систему, способную выдерживать нагрузку в 5 млн rps
- Опыт использования gRPC в Почте Mail.ru
- Разгоняем обработку событий до 1,6 миллионов в секунду
- Архитектура растущего проекта на примере ВКонтакте
- Picodata: простое масштабирование Tarantool
- Оптимизация базового поиска Озон
Видео
- Лекции Технопарка. 3 семестр. Проектирование высоконагруженных систем
- Плейлист по HighLoad — Олег Бунин. Лекторий ФПМИ
- Проектирование и запуск высоконагруженной веб-системы в условиях жесточайшего цейтнота — доклад Александра Сербула на конференции Analyst Days-13
- Архитектура высоконагруженных систем — краткий обзор основных приёмов масштабирования от Ани Крх
- Архитектура масштабирования: ускоряем обработку и повышаем доступность данных — доклад Сергея Харламова (VK) на конференции ArchDays 2022
- Проектирование высоконагруженных приложений — доклад Евгения Клокова (БАРС груп)
- Архитектура распределенных систем — школа бэкенд разработки Яндекса
- Точки отказа в хайлоад системах. Backend
Конференция
HighLoad++ — доклады по архитектуре и проектированию высоконагруженных систем
Книги
- 🐗 Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка
- Разработка высоконагруженных систем — очень полезная брошюра по материалам конференции HighLoad++