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