Я пишу сервер Java, который использует простые сокеты для приема соединений от клиентов. Я использую довольно простую модель, в которой каждое соединение имеет свой собственный поток, читающий его в режиме блокировки. Псевдокод:
handshake();
while(!closed) {
length = readHeader(); // this usually blocks a few seconds
readMessage(length);
}
cleanup();
(Потоки создаются из Executors.newCachedThreadPool ()
, поэтому не должно быть при их запуске не будет никаких значительных накладных расходов)
Я знаю, что это немного наивная установка, и она не очень хорошо масштабировалась бы для многих соединений, если бы потоки были выделенными потоками ОС. Однако я слышал, что несколько потоков в Java могут совместно использовать один аппаратный поток. Это правда?
Зная, что я буду использовать виртуальную машину Hotspot в Linux на сервере с 8 ядрами и 12 ГБ ОЗУ, как вы думаете, эта установка будет работать для тысяч подключений? Если нет, то каковы альтернативы?