So che è una domanda ricorrente e ho letto articoli come il seguente http://www.mailinator.com/tymaPaulMultithreaded.pdf dicendo che non è necessariamente vero che nio scala meglio di io.Quali sono i vantaggi di java.nio per un server web?
Ma non riesco a vedere come potrebbe java nio scalare meglio nello sviluppo di un server Web rispetto a un'architettura tradizionale dei thread accettatore/lavoratore? Mi spiego:
Di solito i server web Java utilizzano il seguente schema per gestire le connessioni:
A pochi fili accettore limitato al numero di core bloccare il metodo accept() del ServerSocket:
while (true) { socket = serverSocket.accept(); // handleRequest submits the socket to a queue handleRequest(socket); socket.close(); }
Quando il socket client viene recuperato, viene inviato a una coda non bloccante e quindi elaborato da un thread di lavoro da un pool di thread di lavoro. Il numero di thread di lavoro in base alla durata delle operazioni io eseguite.
Come utilizzare java.nio renderebbe questa architettura più scalabile?
Voglio dire che avrei ancora bisogno di avere thread di lavoro per elaborare la richiesta che farebbe operazioni di blocco (accesso al database o al filesystem, invocazione di servizi esterni). Se le operazioni di back-end non vengono eseguite in modo asincrono come in node.js, avrei comunque bisogno di thread funzionanti che limitassero la scalabilità complessiva rispetto a 1 o 2 thread di dispatcher di eventi.
NIO è più utile quando si hanno connessioni inattive di lunga durata. Quindi, ad esempio, un'applicazione che utilizza pesantemente il polling lungo sarebbe in grado di elaborare più richieste con NIO che con IO come con IO ogni blocco di collegamento a lungo polling e vincola un thread. Con NIO questo non è il caso. –
Per ridurre i numeri di thread: più thread, più chiamate di sistema. – coolcfan