## Лабораторная работа 7. Балансировка нагрузки в распределённых системах при помощи открытых технологий на примерах

# Задание
Написать небольшое эссе (буквально несколько абзацев) своими словами (пожалуйста не пользуйтесь гуглом :). А помогут Вам в этом вопросы из списка:

Какие алгоритмы и методы используются для балансировки нагрузки?
Какие открытые технологии существуют для балансировки нагрузки?
Как осуществляется балансировка нагрузки на базах данных?
Реверс-прокси как один из элементов балансировки нагрузки.

# Эссе 
Для начала дам определение, что такое балансировка нагрузки. Если простыми словами, балансировка нагрузки - это процесс распределения рабочей нагрузки между несколькими вычислительными ресурсами (процессами, потоками, серверами и т.д.) таким образом, чтобы ресурсы использовались равномерно и максимально эффективно. Есть двя метода для балансировки нагрузки: Статическая балансировка и Динамическая балансировка. В случае статическаой балансировка каждый поток получает фиксированный объем работы, определенный заранее. В случае динамической балансировки объем работы для каждого ресурса может изменяться в процессе выполнения. Если один поток или узел заканчивает свою задачу быстрее других, ему можно выделить новую задачу.

К статическому методу относятся, например, алгоритмы Round Robin, Random Allocation. При алгоритме Round Robin задачи назначаются ресурсам по очереди, по кругу. Такой подход важен, если ресурсы однородные и выполняют примерно одинаковые задачи, как в случае с веб-серверами, обрабатывающими запросы пользователей. При Random Allocation задачи распределяются случайным образом. Этот метод может используется при равномерных нагрузках и однородных ресурсах, но в случае крупных задач может быть неэффективным из-за возможного неравномерного распределения.

К динамическому методу относятся, например, алгритмы Least Connections и Least Response Time. Алгоритм Least Connections назначает новые задачи или запросы тому ресурсу (серверу, потоку и т.д.), у которого на данный момент наименьшее количество активных подключений или выполняемых задач. Логика основана на предположении, что ресурс с меньшим количеством задач вероятнее всего освободится быстрее и справится с новым запросом более эффективно. Алгоритм Least Response Time выбирает ресурс на основе текущего времени отклика (время, необходимое для выполнения запроса или задачи). Новый запрос направляется на ресурс, который показывает наименьшее среднее время отклика на запросы.

Для балансировки нагрузки существуют такие технологии как: Nginx, HAProxy, Kubernetes Ingress.

Балансировка нагрузки на базах данных обычно осуществляется методами: Чтение-запись (запросы на чтение направляются к копиям базы, а записи — к основному серверу), Шардинг (Данные делятся на части (шарды), и каждая часть хранится на отдельном сервере), Кеширование, Прокси-балансировщики (Для распределения запросов между репликами).

Реверс-прокси — это сервер, который принимает запросы от клиентов и перенаправляет их на один из серверов бэка (например, веб-серверов или баз данных), действуя как посредник. Он выполняет такие задачи как распределение нагрузки и снижение нагрузки. Реверс-прокси распределяет входящие запросы между несколькими серверами, используя алгоритмы, такие как упомянутые выше (Round Robin, Least Connections и др.), чтобы равномерно распределить нагрузку. Реверс-прокси может кэшировать часто запрашиваемые данные, снижая нагрузку на серверы бэка. Примеры технологий реверс-прокси: Nginx, HAProxy, Apache HTTP Server с модулем mod_proxy.

Балансировка нагрузки это важная технология для грамотного распредления нагрузки между ресурсами. Здесь были рассмотрены методы и технологии, используемые для оптимизации работы систем, посредством разных алгоритмов распределения задач.