Как реализовать веб-сервер балансировки нагрузки "Round Robin" в Java - PullRequest
2 голосов
/ 22 ноября 2011

Я планирую реализовать балансировку нагрузки "Round Robin" в Java на очень простом веб-сервере HTTP.

Round Robin в этом случае будет означать один HTTP-запрос на порт.

Допустим, у меня есть веб-сервер, на котором запущено 3 потока для 3 разных портов, каждый поток прослушивает соединение с этим портом. (Этот подход может быть неправильным.)

Таким образом, к порту приходит запрос HTTP-соединения, и говорят, что для этого нужно 3 HTTP-запроса (например, веб-страница с 2 изображениями). Если этот запрос поступил, например, через порт 1234, а два других моих потока сидят на двух других портах, ничего не делая, как бы я сбалансировал нагрузку? Таким образом, первый поток получает первый запрос, второй поток - следующий, третий - следующий и обратно. (Если это мое правильное понимание круглого робина.)

1 Ответ

2 голосов
/ 22 ноября 2011

Вам нужны две вещи:

1) Вам нужна структура данных, которая будет вращаться между портами по порядку, навсегда.Это называется «круговой структурой данных».

2) Вам необходимо убедиться, что структура данных является общей для потоков, то есть когда один поток начинает использовать портдля выполнения каких-либо действий структура данных уведомляется о том, что этот порт занят, а затем конкретный порт блокируется.

Простой подход может заключаться в использовании здесь синхронизированной циклической очереди с блокировками.в каждом из двух слотов.

Как только вы добавите репрезентативную блокировку каждого порта в очередь, вы можете иметь каждый поток, блокирующий этот конкретный порт во время использования.Как только замок снят, работа может начаться заново.

Итак, сначала мы создадим очередь с 2-мя блокировками init, и на сервере будет установлен итератор в очереди.

Когда поступит запрос - поток запросит у сервера порт.Сервер проверит, заблокирован ли текущий (1-й) слот.Если это так, он будет ожидать --- когда разблокирован, он будет асинхронно передавать блокировку потоку и увеличивать позицию в очереди.Затем поток заблокирует этот ресурс, обработает запрос и разблокирует его.Как только поток завершит обработку, он разблокирует ресурс.Между тем, если приходит второй поток, сервер может назначить второй порт, если этот порт свободен.

Конечно, здесь существует потенциальная тупиковая ситуация: если один поток не завершится, сервер застрянет в ожидании разблокировки блокировки, прежде чем он перейдет к следующему порту.

http://www.koders.com/java/fid13E588928D0C01917AC9C30E35D802BDBA546368.aspx?s=Queue#L23

...