Design principles of highly loaded systems
Принципы проектирования высоконагруженных систем
Репликация
- разделение запросов на чтение и запись
- ускорение запросов
- дублирование данных
- минус: неконсистентность данных (лаг репликации)
Шардирование (партиционирование)
- когда данных много и они не влизают на сервер
- разделение одних данных по нескольким серверам
Индексирование
- ускорение запросов в базе данных
- минус: избыточность данных
Денормализация
- хранение в удобном виде для обработки
- ускорение запросов
- минус: избыточность данных
Кеширование
- уменьшение нагрузки на базу данных
- ускорение запросов
- топики: прогрев кеша, инвалидация, вытеснение
Горизонтальное масштабирование
- запуск нескольких инстансов одного приложения на разных серверах
- уменьшение точек отказа
- увеличение общей производительности системы
- приложения должны быть stateless
Вертикальное масштабирование
- увеличение производительности одного сервера
- минус: есть предел
Сервисно-ориентированная архитектура
- разбиение функций всего приложения по разным приложениям
- уменьшение точек отказа
- ускорение разработки
Монолитное приложение
- уменьшение количества сетевого взаимодействие частей приложения
- минус: сложная и медленная разработка
Фронтенды приложения
- отдает статику
- обрабатывает легкие и быстрые запросы
- обрабатывает медленные клиенты
- легкие приложения
- пример: nginx, caddy, traefik, etc
Бэкенды приложения
- обрабатывает тяжелую логику
- тяжелые приложения
Балансировка фронтендов
- распределение клиентских запросов между множеством фронтенд приложений
- пример: dns-балансировка
Балансировка бэкендов
- распределение запросов от фронтендов между множеством бэкенд приложений
Очередь задач
- отложенное выполнение
- межсервисная коммуникация
- пример: kafka, rabbitmq
Толстый клиент
- перенос большого количетсва логики на клиент
- уменьшение логики на бэкенде
- минус: сложность