2016-03-20 3 views
0

Я пишу UDP балансировщик нагрузки, используя Netty.UDP load balancer с использованием Netty

Балансировщик нагрузки прослушивает местный транспортный адрес. В отношении Netty создан только один Channel, чтобы прослушать этот адрес. Входящие пакеты UDP затем отправляются одним потоком (однопоточной группы циклов событий) в пул рабочих потоков для обработки (здесь средство обработки, выполняющее балансировку нагрузки).

С исходящей стороны доступно несколько серверов. Для каждого принятого UDP-пакета связанный рабочий поток выбирает сервер и пересылает UDP-пакет на этот сервер. Для пересылки UDP-пакета требуется Channel.

Я вижу четыре подхода:

  1. с использованием одного исходящего Channel, который используется для пересылки всех пакетов к серверам. Используя этот подход, пакеты всегда будут отправляться с одного и того же транспортного адреса.
  2. Использование одного исходящего Channel за доступный сервер. Каждый пакет, перенаправленный на сервер, будет перенаправлен с использованием Channel, связанного с этим сервером.
  3. Использование N исходящий Channel за доступный сервер. Каждый пакет, перенаправленный на сервер, будет перенаправлен с использованием Channel из группы Channels, связанной с этим сервером.
  4. Использование нового Channel для каждого пакета для пересылки.

Я пробовал подход 4, и я вижу, что он дает плохую производительность. Особенно, у меня была проблема, когда было создано слишком много сокетов, и поэтому она превысила ограничение на открытые файлы.

Поскольку Channels разделяют между несколькими пакетами, подходы 1, 2 и 3 требуют добавления адреса отправителя в пакет UDP, но это не проблема для меня, поскольку мне нужна эта информация для сервера, который будет фактически обрабатывать пакет ,

Каков рекомендуемый подход между 1, 2 и 3? Является ли хорошей практикой использовать один или несколько Channel для каждого сервера назначения?


EDIT:

Другой подход, который приходит на ум, чтобы использовать общий пул Channels. Когда принимается UDP-пакет, выбирается доступный сервер, тогда из пула выбирается Channel (например, с использованием алгоритма выбора циклического алгоритма), и пакет пересылается с использованием этого Channel.

ответ

0

У меня схожая проблема с вами, и я использую Another approach. Но я не выбрал Another approach для проблемы с производительностью балансировки, но для обеспечения производительности доступных серверов.

Для работы балансира я не вижу большой разницы между подходом 1 и Another approach для моего теста производительности. И Netty имеет верхний предел скорости одного канала прослушивания, я думаю, вам лучше использовать EpollChannelOption.SO_REUSEPORT для создания нескольких каналов прослушивания.