Я пишу UDP
балансировщик нагрузки, используя Netty
.UDP load balancer с использованием Netty
Балансировщик нагрузки прослушивает местный транспортный адрес. В отношении Netty
создан только один Channel
, чтобы прослушать этот адрес. Входящие пакеты UDP затем отправляются одним потоком (однопоточной группы циклов событий) в пул рабочих потоков для обработки (здесь средство обработки, выполняющее балансировку нагрузки).
С исходящей стороны доступно несколько серверов. Для каждого принятого UDP-пакета связанный рабочий поток выбирает сервер и пересылает UDP-пакет на этот сервер. Для пересылки UDP-пакета требуется Channel
.
Я вижу четыре подхода:
- с использованием одного исходящего
Channel
, который используется для пересылки всех пакетов к серверам. Используя этот подход, пакеты всегда будут отправляться с одного и того же транспортного адреса. - Использование одного исходящего
Channel
за доступный сервер. Каждый пакет, перенаправленный на сервер, будет перенаправлен с использованиемChannel
, связанного с этим сервером. - Использование N исходящий
Channel
за доступный сервер. Каждый пакет, перенаправленный на сервер, будет перенаправлен с использованиемChannel
из группыChannels
, связанной с этим сервером. - Использование нового
Channel
для каждого пакета для пересылки.
Я пробовал подход 4, и я вижу, что он дает плохую производительность. Особенно, у меня была проблема, когда было создано слишком много сокетов, и поэтому она превысила ограничение на открытые файлы.
Поскольку Channels
разделяют между несколькими пакетами, подходы 1, 2 и 3 требуют добавления адреса отправителя в пакет UDP, но это не проблема для меня, поскольку мне нужна эта информация для сервера, который будет фактически обрабатывать пакет ,
Каков рекомендуемый подход между 1, 2 и 3? Является ли хорошей практикой использовать один или несколько Channel
для каждого сервера назначения?
EDIT:
Другой подход, который приходит на ум, чтобы использовать общий пул Channels
. Когда принимается UDP-пакет, выбирается доступный сервер, тогда из пула выбирается Channel
(например, с использованием алгоритма выбора циклического алгоритма), и пакет пересылается с использованием этого Channel
.