Java socketserver: Как обработать много входящих соединений?

Я пишу простой многопоточный socketserver, и я задаюсь вопросом, как лучше всего обработать входящие соединения:

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

  2. добавьте все входящие соединения в очередь и имейте пул рабочих потоков, которые обрабатывают очередь

Я склонен пойти для опции 2, потому что я действительно не хочу отказываться от каких-либо соединений, даже при высоких загрузках, но я задаюсь вопросом, существуют ли какие-либо соображения, я должен знать с принятием эффективно неограниченных соединений?

5
задан SlappyTheFish 17 March 2010 в 22:05
поделиться

4 ответа

При неограниченном количестве подключений вы потенциально можете создать огромное количество потоков. Это означает, что требуется много обработки, плюс каждый поток будет потреблять фиксированный объем памяти по умолчанию только для кучи (я думаю, что этот показатель составляет 512 КБ на поток , но это может зависеть от платформы).

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

Вы можете прочитать эту статью о создании серверов с использованием NIO или, возможно, ознакомиться с такими фреймворками, как Apache Mina .

6
ответ дан 18 December 2019 в 13:13
поделиться

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

2
ответ дан 18 December 2019 в 13:13
поделиться

1 поток на соединение не масштабируется. Об этом читайте в Проблема C10K . Его давно читают, но он очень известен.

Я бы посоветовал узнать о NIO или, скорее, использовать впечатляющий фреймворк netty , который выполняет всю тяжелую работу (NIO) за вас.

2
ответ дан 18 December 2019 в 13:13
поделиться

Я действительно не хочу отказываться ни от каких связи

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

Теория очередей гласит, что оптимальный уровень загрузки составляет около 70%. Если ваш сервер будет иметь постоянную нагрузку выше этого значения, приобретите более быстрое оборудование, пока этого не произойдет.

Сказав это, если вы ожидаете сотни тысяч соединений, я бы использовал пул потоков или NIO. Если вы ожидаете только тысячи, то поток на соединение - самый простой способ.

4
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: