Was ist der Vorteil von Async Servlets?

Nick Div

Ich habe über Async-Servlets 3.1 gelesen

Es wird gesagt, dass der Thread, der die Anforderung sendet, freigegeben wird, wenn viele zeitaufwändige Vorgänge ausgeführt werden müssen, um beispielsweise eine lange Liste von Daten aus der Datenbank abzurufen.

Ich kann den Vorteil hier nicht verstehen, da sowieso ein neuer Thread zugewiesen wird, um die Datenbankverbindung und die Antwortverarbeitung zu verarbeiten, selbst wenn der ursprüngliche Thread, der für die Anforderung verantwortlich war, freigegeben wird.

Wie ist das Async-Servlet vorteilhafter als das Thread-pro-Anfrage-Modell, das wir zuvor hatten?

Manish Maheshwari

Hier in zwei Teilen antworten:

  1. Wie ist das Async-Servlet vorteilhafter als das zuvor verwendete Thread-pro-Anforderungsmodell : Dieses Modell ist längst tot, und fast alle Java-Server verwenden NIO, wodurch diese Server Hunderte von Verbindungen mit einer Handvoll Threads verarbeiten können. Man könnte dies für Ihren App - Server überprüfen , wie gut, und Sie werden angenehm überrascht sein zu sehen , dass es nicht NIO verwenden :). Die Async-Servlets haben nichts mit der einen Anforderung pro Thread zu tun.
  2. Warum dann Async-Servlets : Nun, Async-Servlets ermöglichen das Abschließen der ursprünglichen Anforderung, ohne auf den Abschluss der Async-Task zu warten (was hoffentlich lange dauert). Auf diese Weise kann der Remote-Client sofort beantwortet werden, und er kann bei Bedarf andere Aufgaben ausführen. Die asynchrone Aufgabe kann später in einem der Threads vom Server verarbeitet werden. Diese Async-Vorgänge werden normalerweise in einem separaten Thread-Pool ausgeführt, der für Async-Vorgänge vorgesehen ist. Der für die Verarbeitung von Clientverbindungen vorgesehene Thread-Pool wird nicht für asynchrone Vorgänge verwendet.

Update: Weitere Details dazu, warum wir Async-Servlets benötigen, wenn wir bereits den NIO-Thread-Pool verwendet haben. Ich habe meine Notizen vor einiger Zeit über nicht blockierende E / A unter http://manish-m.com/?p=996 notiert . Sie können auch einen verwandten Beitrag unter http://manish-m.com/?p=915 anzeigen (insbesondere den Abschnitt "IO-Spielplatz" auf dieser Seite).

Der NIO-Thread-Pool dient zur Verarbeitung mehrerer Verbindungsanforderungen . Es verwendet die nicht blockierende E / A-Funktion von Kerneln, sodass eine kleine Anzahl von Threads mit vielen Verbindungen arbeiten kann.

Dieselben Threads, die Daten aus dem Netzwerkpuffer lesen, führen jedoch auch den "Benutzercode" aus (den wir in Servlets schreiben). Das Framework des Servlet-Containers für NIO übernimmt das Akzeptieren von Client-Anforderungen, kann jedoch keinen von uns geschriebenen "blockierenden Benutzercode" selbst verarbeiten. Wenn wir also eine DB-Abfrage schreiben, die beispielsweise 10 Sekunden dauert, kann das Container-Framework diese nicht asynchron selbst verarbeiten. Wir würden den ursprünglichen NIO-Thread-Pool blockieren, indem wir Blockierungscode in Servlets schreiben. Daher müssen wir explizit alles schreiben, von dem wir glauben, dass es die Anforderungsthreads des Containers als Async-Servlet in Java EE blockieren kann.

Wenn wir andere NIO-Frameworks wie Netty, MINA verwenden, müssen wir ebenfalls sicherstellen, dass der Code die NIO-Threads, die die Netzwerkverbindungen verarbeiten, nicht blockiert. Dies wird normalerweise erreicht, indem solche lang laufenden Aufgaben in einen anderen Thread-Pool verlagert werden (was der Container tut, wenn Sie ein asynchrones Servlet schreiben).

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    Modbus Python Schneider PM5300

  2. 2

    Glassfish v3.0.1 im Vergleich zu Oracle GlassFish Server 3.0.1 - Gibt es einen technischen Grund, die kommerzielle Version zu verwenden?

  3. 3

    Wie schließe ich mehrere Ordner mit der Variablen EXTRA_ARGS aus?

  4. 4

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  5. 5

    Wie kann man eine Multi-Container-Anwendung in Steuerkarten erstellen?

  6. 6

    ElasticSearch - Knotensperren konnten nicht abgerufen werden

  7. 7

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  8. 8

    Elasticsearch startet nicht nach dem Laden in viele Daten

  9. 9

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  10. 10

    Wie Verwenden von Httpclient mit jedem SSL-Zertifikat, egal wie „schlecht“ es ist

  11. 11

    Wie vergleicht man scala.xml-Knoten richtig?

  12. 12

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  13. 13

    Wie füge ich eine Spalte in einer Zeile in der Ansible Jinja2-Vorlage mit der for-Schleife hinzu?

  14. 14

    HTTPS-Verbindung mit Moneris-Servern in Curl

  15. 15

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  16. 16

    Bester Crawler, um festzustellen, ob er mit Technologien gebaut wurde?

  17. 17

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  18. 18

    Wie kann ich den Kaskadenmodus global einstellen?

  19. 19

    Eclipse Oxygen - Projekte verschwinden

  20. 20

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  21. 21

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

heißlabel

Archiv