Ich weiß, es regelmäßig wieder Frage ist, und ich habe Artikel gelesen wie die folgenden http://www.mailinator.com/tymaPaulMultithreaded.pdf sagte, dass als io nicht unbedingt wahr, dass nio Skalen besser ist.Welche Vorteile bietet java.nio für einen Webserver?
aber ich bin kämpfen, um zu sehen, wie nio Skalen besser java könnte, wenn ein Web-Server als eine herkömmliche Akzeptor/Worker-Threads Architektur zu entwickeln? Lassen Sie mich erklären:
Normalerweise Java-Web-Server verwenden das folgende Muster Verbindungen zu handhaben:
Einige Akzeptor-Fäden auf die Anzahl der Kerne auf dem akzeptieren die ServerSocket- Block begrenzt() -Methode:
while (true) { socket = serverSocket.accept(); // handleRequest submits the socket to a queue handleRequest(socket); socket.close(); }
Wenn das Client-Socket abgerufen wird er in eine nicht blockierende Warteschlange übermittelt wird und dann von einem Arbeiter-Thread aus einem Pool von Arbeitsthreads verarbeitet. Die Anzahl der Worker-Threads hängt von der Dauer der ausgeführten io-Vorgänge ab.
Wie java.nio verwenden würde diese Architektur skalierbarer machen?
Ich meine, ich würde noch Worker-Threads haben müssen, um die Anforderung zu verarbeiten, die Sperrung Operationen tun würde (Access-Datenbank oder Dateisystem, rufen Sie externe Dienste). Wenn die Back-End-Vorgänge nicht wie in node.js asynchron durchgeführt werden, würde ich immer noch bearbeitete Threads benötigen, die die Gesamt-Skalierbarkeit im Vergleich zu 1 oder 2 Event-Dispatcher-Threads einschränken würden.
NIO ist sinnvoller, wenn Sie lange im Leerlauf befindliche Verbindungen haben. So könnte beispielsweise eine Anwendung, die lange Abfragen in Anspruch nimmt, mehr Anfragen mit NIO als mit IO verarbeiten können, da bei jeder langen Abfrageverbindung ein Thread blockiert und gebunden wird. Bei NIO ist dies nicht der Fall. –
Um die Thread-Nummern zu reduzieren - mehr Threads, mehr Systemaufrufe. – coolcfan