webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen Thread pro Verbindung und Thread pro Anfrage?

Können Sie bitte die beiden Methoden erläutern, die in verschiedenen Servlet-Implementierungen implementiert wurden:

  1. Thread pro Verbindung
  2. Thread pro Anfrage

Welche der beiden oben genannten Strategien skaliert besser und warum?

20
Geek

Welche der beiden Strategien ist besser skalierbar und warum?

Thread-pro-Request skaliert besser als Thread-pro-Verbindung.

Java-Threads sind ziemlich teuer und verwenden in der Regel jeweils ein 1-MB-Speichersegment, unabhängig davon, ob sie aktiv oder im Leerlauf sind. Wenn Sie jeder Verbindung einen eigenen Thread zuweisen, befindet sich der Thread normalerweise zwischen aufeinanderfolgenden Anforderungen an die Verbindung im Leerlauf. Letztendlich muss das Framework entweder keine neuen Verbindungen mehr annehmen (es kann keine weiteren Threads mehr erstellen) oder es müssen alte Verbindungen getrennt werden (was zu Verbindungsabbrüchen führt, wenn der Benutzer aufwacht).

Eine HTTP-Verbindung erfordert deutlich weniger Ressourcen als ein Thread-Stack, obwohl die Anzahl der offenen Verbindungen von 64 KB pro IP-Adresse aufgrund der Funktionsweise von TCP/IP begrenzt ist.

Im Gegensatz dazu wird im Thread-pro-Anfrage-Modell der Thread nur während der Verarbeitung einer Anfrage zugeordnet. Das bedeutet normalerweise, dass der Dienst weniger Threads benötigt, um dieselbe Anzahl von Benutzern zu handhaben. Da Threads erhebliche Ressourcen benötigen, bedeutet dies, dass der Dienst besser skalierbar ist.

(Beachten Sie, dass Thread-per-Request nicht bedeutet, dass das Framework die TCP-Verbindung zwischen der HTTP-Anforderung schließen muss.)


Allerdings ist das Thread-per-Request-Modell nicht ideal, wenn bei der Verarbeitung jeder Anfrage lange Pausen auftreten. (Und es ist insbesondere nicht ideal, wenn der Dienst den comet - Ansatz verwendet, bei dem der Antwortstream lange Zeit offengehalten wird.) Um dies zu unterstützen, bietet die Servlet 3.0 - Spezifikation einen "asynchronen Servlet" - Mechanismus, der eine Servlet-Anforderungsmethode, um die Verknüpfung mit dem aktuellen Anforderungsthread zu unterbrechen. Dadurch wird der Thread freigegeben, um eine weitere Anforderung zu bearbeiten.

Wenn die Webanwendung so ausgelegt werden kann, dass sie den "asynchronen" Mechanismus verwendet, ist sie wahrscheinlich skalierbarer als entweder Thread-pro-Anfrage oder Thread-pro-Verbindung.


FOLLOWUP

Angenommen, eine einzelne Webseite mit 1000 Bildern. Dies führt zu 1001 HTTP-Anforderungen. Nehmen wir weiterhin an, dass HTTP-persistente Verbindungen verwendet werden. Bei der TPR-Strategie führt dies zu 1001 Thread-Pool-Verwaltungsoperationen (TPMO). Mit der TPC-Strategie wird dies zu 1 TPMO führen. Abhängig von den tatsächlichen Kosten für ein einzelnes TPMO kann ich mir Szenarien vorstellen, in denen TPC besser skaliert als TPR.

Ich denke, es gibt einige Dinge, die Sie nicht berücksichtigt haben:

  • Der Webbrowser, für den eine Vielzahl von URLs abgerufen werden müssen, um eine Seite fertigzustellen, kann mehrere Verbindungen herstellen.

  • Bei TPC und dauerhaften Verbindungen muss der Thread warten, bis der Client die Antwort empfängt und die nächste Anforderung sendet. Diese Wartezeit kann erheblich sein, wenn die Netzwerklatenz hoch ist. 

  • Der Server hat keine Möglichkeit zu wissen, wann eine bestimmte (dauerhafte) Verbindung geschlossen werden kann. Wenn der Browser es nicht schließt, kann es zu einem "Verweilen" des TPC-Threads kommen, bis der Server die Verbindung abläuft.

  • Die TPMO-Overheads sind nicht besonders groß, insbesondere wenn Sie die Pool-Overheads von den Context-Switch-Overheads trennen. (Sie müssen dies tun, da bei TPC bei persistenten Verbindungen Kontextwechsel auftreten werden; siehe oben.)

Meines Erachtens ist es wahrscheinlich, dass diese Faktoren die TPMO-Einsparung überwiegen, da für jede Verbindung ein Thread vorgesehen ist.

23
Stephen C

HTTP 1.1 - Unterstützt persistente Verbindungen Das bedeutet, dass mehr als eine Anfrage/Antwort mit derselben HTTP-Verbindung empfangen/gesendet werden kann. Um also die Anfragen, die mit derselben Verbindung empfangen werden, parallel auszuführen a Für jede Anforderung wird eine neue Thread erstellt.

HTTP 1.0 - In dieser Version wurde nur eine Anforderung über die Verbindung empfangen und die Verbindung wurde nach dem Senden der Antwort geschlossen. Es wurde also nur ein Thread für eine Verbindung erstellt.

6
Narendra Pathai

Thread per connection ist das Konzept der Wiederverwendung desselben HTTP Connection aus multiple requests ( keep-alive ).

Thread per requestwird aus einer client einen Thread für each request erstellen. Der Server kann eine threads-Nummer gemäß request erstellen.

3
Suresh Atta

Thread per request erstellt einen Thread für jede HTTP-Anfrage, die der Server empfängt.

Thread pro Verbindung Verwendet dieselbe HTTP-Verbindung von mehreren Anforderungen (keep-alive) .AKA Permanente HTTP-Verbindung . Beachten Sie jedoch, dass dies nur von HTTP 1.1 unterstützt wird.

Thread Per Request ist schneller, da die meisten Web-Container Thread-Pooling verwenden.

Die Anzahl der maximalen parallelen Verbindungen, die Sie für die Anzahl der Kerne auf Ihrem Server festlegen sollten. Weitere Kerne => mehr parallele Threads.

Hier erfahren Sie, wie Sie ... Tomcat 6: http://Tomcat.Apache.org/Tomcat-6.0-doc/config/executor.html konfigurieren.

Tomcat 7: http://Tomcat.Apache.org/Tomcat-7.0-doc/config/executor.html

Beispiel 

1
Sudhakar

Thread pro Anforderung sollte besser sein, da Threads wiederverwendet werden, während einige Clients möglicherweise inaktiv sind. Wenn Sie viele gleichzeitige Benutzer haben, könnten sie mit einer geringeren Anzahl von Threads bedient werden, und eine gleiche Anzahl von Threads wäre teurer. Es gibt noch eine weitere Überlegung - wir wissen nicht, ob der Benutzer noch mit der Anwendung arbeitet, so dass wir nicht wissen können, wann ein Thread zerstört wird. Bei einem Thread pro Request-Mechanismus verwenden wir nur einen Thread-Pool.

0
Mikhail