Разработка нагруженных систем
Заметка 1. Введение
Нагруженная система (High-load system) - это система, в которой нагрузка (число пользователей, запросов, объём данных или другое) настолько велика, что одного сервера или простой архитектуры уже недостаточно
Нагрузка бывает разной:
- Число запросов в секунду (RPS, requests per second)
- Объём данных за единицу времени, а также скорость их роста
- Число одновременных соединений (например, в онлайн-играх)
- Сложность вычислений (например, при обработке видео)
Для системы, отвечающей на внешние запросы, выделяют такие характеристики:
-
Задержка (Latency) - время ответа на один запрос
Так как время ответа обычно не является постоянной величиной (из-за разной маршрутизации, планировании обработки пакетов в промежуточных узлах и так далее), рассматривают задержку как случайную величину. У получившегося распределения рассматривают:
- Джиттер (jitter) - отклонение от среднего (берут среднеквадратичное отклонение или среднее абсолютное отклонение)
- Процентили p50, p90, p95, p99 и другие. Процентиль pX обозначает значение времени, при котором X% запросов обработались быстрее этого значения. Процентиль p50 также является медианой
- Пропускная способность (Throughput) - число запросов или данных, которое система способна обрабатывать за единицу времени
- Доступность (Availability) - доля времени, когда система работоспособна, в процентах
Основные проблемы высоконагруженных систем являются:
- Узкие места (они же “бутылочные горлышки”, bottleneck) - чаще всего это скорость обработки данных центральным процессором, пропускная способность и задержка памяти (будь то ОЗУ или ПЗУ), сеть, базы данных и другие компоненты системы
- Сбои, так как при большом числе компонентов отказы неизбежны, а не исключительны
- Согласованность данных - при распределении данных сложно поддерживать единое состояние (см. CAP-теорему)
- Рост сложности и стоимость - распределённые системы труднее отлаживать и сопровождать, а масштабирование требует затрат на инфраструктуру