Если при использовании горизонтального масштабирования вычислительных ресурсов несколько параллельных экземпляров программного компонента обрабатывают входящие запросы, возникают определенные проблемы, с которыми должен справиться проект решения.
Основная проблема заключается в том, что входящие запросы, поступающие в определенный программный компонент, должны распределяться между всеми экземплярами этого программного компонента. Логически данную ситуацию можно рассматривать как обработку потока запросов, направленных на определенную конечную точку сервиса (формально эта конечная точка имеет сетевой адрес, на который и оправляются запросы). Несколько параллельных экземпляров программного компонента, реализующих сервис, имеют свою собственную (частную) конечную точку, каждая из которых имеет свой сетевой адрес и комбинацию портов. Компонент, который называется балансировщиком нагрузки, используется для управления конечной точкой сервиса и направления каждого входящего запроса в один из параллельных экземпляров.
Балансировщик нагрузки подключается к конечной точке сервиса и обрабатывает все входящие запросы. Балансировщик нагрузки ведет список всех экземпляров соответствующего программного компонента. При этом балансировщику нагрузки должен быть известен адрес конечной точки и порт каждого экземпляра. Каждый входящий запрос направляется на один из экземпляров программного компонента. Выбор экземпляра для входящего запроса определяется алгоритмом диспетчеризации (алгоритмы диспетчеризации могут быть различными).
Примером простого алгоритма диспетчеризации является циклический алгоритм (round-robin), когда каждый из экземпляров используется по очереди, а алгоритм стремится отправить одинаковое количество запросов на все экземпляры. Одной из разновидностей этого алгоритма является циклический взвешенный алгоритм (weighted round-robin), когда каждому из экземпляров присваивается весовой коэффициент, от которого зависит количество передаваемых ему экземпляров. Более сложный алгоритм диспетчеризации связан с рабочей нагрузкой. Он работает по принципу невыполненных запросов. При этом балансировщику нагрузки должно быть известно количество запросов, которые еще обрабатываются каждым экземпляром, и новые входящие запросы должны отправляться на наименее загруженный экземпляр.
Балансировщик нагрузки должен обрабатывать динамическое количество экземпляров. Могут запускаться новые экземпляры, а существующие могут останавливаться. Запуск и остановка могут выполняться в целях поддержания масштабирования и адаптивности либо вследствие отказа экземпляра.
Балансировщик нагрузки может быть реализован с использованием обратного прокси-сервера, который может предоставлять дополнительные функциональные возможности, такие как кеширование статического контента, обработка SSL (шифрование/дешифрование) и защита от атак [из 14.2 Параллельные экземпляры и балансировка нагрузки ГОСТ Р 70860—2023]