2015-03-02 5 views
9

Nach dem Lesen über den Tomcat NIO Connector bekomme ich immer noch keins: Ist der nio Connector von Vorteil, wenn der Applikationscode blockiert, dh beim Lesen aus der Datenbank beim Lesen der Dateisystem, beim Aufruf externer Webdienste?Tomcat NIO Connector mit einer blockierenden Anwendung

So haben Sie beispielsweise eine REST-ähnliche API, die eine Anforderung empfängt, etwas aus der Datenbank liest und eine Antwort zurückgibt. Es verwendet Servlet 3 async nicht, es schreibt nur in die Antwort.

Ich habe keine vollständige Beschreibung der Thread-Pools gefunden, die vom NIO-Connector verwendet werden, aber ich stelle mir vor, dass es einen Thread-Pool für die Verarbeitung der Anfragen hat, sodass jede Anfrage in einem eigenen Thread endet, den sie blockieren kann.

Wenn das der Fall ist, sind die Vorteile von NIO immer noch da, oder der Sperrcode verringert die Vorteile von NIO (in Bezug auf Ressourcenauslastung)?

+0

Verwandte http://techblog.bozho.net/why-non-blocking/ – Bozho

Antwort

9

Ist der nio-Anschluss von Vorteil, wenn der Anwendungscode blockiert ...?

Ja wird der NIO-Stecker mit der Annahme aufgebaut, dass Ihre App irgendwo blockiert. Der NIO-Connector hat grundsätzlich mehrere Socket-Platzhalter und reagiert auf neue eingehende Anfragen, bis Informationen zurückgeschrieben werden.

habe ich eine vollständige Beschreibung der Thread-Pool nicht vom NIO-Anschluss verwendet finden

Ich denke, dies der Beginn Ihrer Verwirrung. Tomcat NIO hat einen Selektor-Pool, keinen Thread-Pool (reference). Der Konnektorcode fragt jeden Selektor ab, ob er eingehende oder ausgehende Bytes zum Senden hat. In diesem Sinne empfängt der Selektor für eine gegebene Anforderung weiterhin Informationen, bis genug zur Verarbeitung der Anforderung mit einem Request/Response-Objekt vorhanden ist, das die Lücke zwischen synchroner E/A und asynchroner E/A (reference) überbrückt.

Der Abrufcode blockiert nie länger als die Zeit, die zum Serialisieren eines Informationspakets benötigt wird, sodass neue Anforderungen problemlos bearbeitet werden können. Die einzige wirkliche Einschränkung ist die Menge an Speicher, die Tomcat zur Verfügung steht. Obwohl es einen Thread-Pool gibt, ist die Anzahl der tatsächlich verwendeten Threads viel niedriger als die Anzahl der Verbindungen, die die Anwendung verarbeiten kann (reference).

Während zwischen Tomcat-Konnektoren Leistungsunterschiede bestehen (reference), ist der Unterschied in der rohen Anfrage/Antwortzeit ziemlich klein, wenn das Servlet selbst blockiert. Der Unterschied in der Anzahl gleichzeitiger Anforderungen, die Tomcat verarbeiten kann, unterscheidet sich jedoch erheblich, wenn Sie nicht blockierende E/A verwenden.

+3

Also, was passiert in diesem Fall mit ThreadLocal? Wenn Socket simuliert wird und derselbe Thread unter mehreren Anfragen geteilt wird, kann es bei der Verwendung von ThreadLocal zu einem Konflikt kommen. Aber das passiert nicht. Wie löst Tomcat (und wahrscheinlich andere Container) dieses Problem? – AlexR

+0

Danke. Zusätzlich zu der Frage von @AlexR - in der Seite, die Sie verknüpften, gibt es "maxThreads" - max Threads wo? Also gibt es einen Pool? – Bozho

+0

http://stackoverflow.com/questions/7925014/is-threadlocal-safe-to-use-with-tomcat-nio-connector – Bozho

Verwandte Themen