2013-12-10 6 views
31

Ich verwende Java (Servlets, JSPs) seit 2 Jahren für Web-Anwendungsentwicklung. In diesen 2 Jahren habe ich nie benötigt multithreading (explizit - wie ich weiß, dass Servlet-Container Threading verwendet, um dasselbe Servlet zu verschiedenen Anfragen zu dienen) in jedem Projekt.Rolle von Multithreading in Web-Anwendung

Aber jedes Mal, wenn ich ein Interview für Web Developer Position (Java), dann gibt es mehrere Fragen im Zusammenhang mit Threads in Java. Ich kenne die Grundlagen von Java-Threading, also ist das Beantworten der Fragen kein Problem. Aber manchmal bin ich verwirrt, ob mir etwas fehlt, während ich eine Web-Anwendung entwickle, indem ich kein Multi-Threading verwende?

Also meine Frage ist, was ist die Rolle von multithreading in Web Application? Jedes Beispiel, bei dem multithreading in einer Web-Anwendung verwendet werden kann, wird geschätzt.

Vielen Dank im Voraus.

+2

IMHO, Sie sind absolut richtig, dass die Hauptaufgabe von Multithreading in Web-Anwendungen ist, mehrere unabhängige Anfragen gleichzeitig zu behandeln, und damit den Server reagieren. – Ingo

+4

Als Beispiel haben Sie eine Benutzerregistrierungsseite und Sie müssen diesem Benutzer eine E-Mail-Benachrichtigung bezüglich der Registrierung senden. In diesem Fall können wir Multithreading verwenden, indem wir eine E-Mail in einem separaten Thread senden. – Foolish

+1

Ich verwende Multi Threading zum Parsen von xmls –

Antwort

40

Multi-Threading kann in Web-Apps hauptsächlich verwendet werden, wenn Sie an asynchronen Aufrufen interessiert sind.

Betrachten Sie zum Beispiel eine Webanwendung, die den Status eines Benutzers in einem GSM-Netzwerk aktiviert (z. B. 4G-Plan aktivieren) und am Ende eine Bestätigungs-SMS oder E-Mail-Nachricht sendet.

Da der Webanruf einige Minuten dauern würde - besonders wenn das GSM-Netz gestresst ist - ist es nicht sinnvoll, ihn direkt vom Web-Thread aus aufzurufen.

Also im Grunde, wenn ein Benutzer „Aktivieren“ klickt, gibt den Server so etwas wie „Vielen Dank für den Plan 4G aktivieren. Ihr Plan wird in wenigen Minuten aktiviert werden und Sie erhalten eine Bestätigungs-SMS/E-Mail erhalten“.

In diesem Fall muss Ihr Server einen neuen Thread erstellen, idealerweise einen Threadpool asynchron verwenden und sofort eine Antwort an den Benutzer zurückgeben.

Workflow:

1- Benutzer klickt Schaltfläche "Aktivieren"
2- Servlet empfängt Anfrage und aktiviert eine neue "Activate 4G-Plan" Aufgabe in einem Thread-Pool.
3- Servlet gibt sofort eine HTML-Antwort an den Benutzer zurück, ohne auf die Fertigstellung der Aufgabe zu warten.
4- Ende der HTTP-Transaktion
. . .

Asynchron, der 4G-Plan später aktiviert wird, und der Benutzer wird per SMS oder E-Mail benachrichtigt, etc ...

5

Sprechen über ein reales Beispiel gibt es mehr Gründe, Multi-Threading zu verwenden, und ich würde keinen Web-Entwickler einstellen, der nichts davon weiß. Aber am Ende sind die Gründe für die Verwendung von Multi-Threading die gleichen für die Standard- und Web-Entwicklung: Entweder wollen Sie etwas, das im Hintergrund eine Weile dauert (auch bekannt als Blocking), um dem Benutzer eine Antwort dazwischen zu geben oder Sie eine Aufgabe haben, die beschleunigt werden kann, indem sie auf mehreren Kernen ausgeführt wird. Wann Multithreading tatsächlich sinnvoll ist, ist jedoch eine andere Frage.

Situation 1: Ein Web-Server, der eine Verarbeitung erfordert und hat niedrige Treffer/Sekunde

Hier Multi-Threading (ggf. den Algorithmus) eine gute Sache ist, wie im Leerlauf Kern verwendet, und Einfädeln kann zu einer schnelleren Reaktion auf den Benutzer führen.

Situation 2: Ein Web-Server, der eine Verarbeitung erfordert und hohe Treffer/Sekunde

Hier Multi-Threading ist möglich, aber als Kerne in der Regel beschäftigt mit anderen Anfragen sind, gibt es keine Ressourcen links nach benutze es richtig. Das Aufteilen der Aufgabe auf mehrere Threads kann sich sogar negativ auf die Antwortzeit auswirken, da die Task nun fragmentiert ist und alle Teile abgeschlossen werden müssen. Die Reihenfolge der Ausführung mit Threads ist jedoch nicht definiert. So könnte ein Client sofort eine Antwort erhalten, während andere auf eine Auszeit warten könnten, bis ihr letztes Fragment schließlich verarbeitet wird.

Situation 3: Ein Web-Server eine Verarbeitung, die eine sehr lange Zeit

Hier Multi-Threading erforderlich ist, gibt es keinen Weg, um es dauert zu tun hat. Ein Client kann nicht Minuten oder wahrscheinlich Stunden warten, bis er die Antwort erhält. In diesem Fall wird in der Regel ein Callback-System implementiert, so dass im Prinzip jede Task eine "API" hat, die nach dem aktuellen Status abgefragt werden kann. Die meisten Online-Shops sind dafür ein Beispiel: Sie bestellen etwas und später können Sie Ihren Bestellstatus abfragen.

Die Alternative zum Threading ist das Forking, wie es Apache in seiner Standardkonfiguration tut. Der Vorteil besteht darin, dass die Last über die Kerne verteilt wird (meistens anwendbar auf Situation 2), und der Web-Code selbst muss nichts tun, um all diese Kerne zu verwenden, da das OS dies automatisch handhabt. Wenn Sie jedoch eine unausgeglichene Last haben, können einige Kerne inaktiv sein und die Ressourcen werden nicht optimal genutzt. Eine Threading-Situation ist fast immer die bessere Lösung, wenn es richtig gemacht wird. Die Apache/Tomcat-Standardkonfiguration verwendet jedoch ein sehr veraltetes Threading-Modell, indem für jede Anforderung ein Thread erstellt wird. Bei einer bestimmten Anzahl von Hits/Sekunde ist die CPU mehr mit dem Threading beschäftigt als mit der tatsächlichen Verarbeitung dieser Anforderungen.

+0

Ist Situation 3 kein Anwendungsfall für JMS, Nachrichtenwarteschlangen usw.? Was zu verwenden, Multithreading oder Nachrichtenwarteschlange? – onlinenaman

+0

Normalerweise eine Kombination aus beidem. Multi-Threading ermöglicht die Nutzung aller verfügbaren Ressourcen und Techniken wie Nachrichtenwarteschlangen, um sicherzustellen, dass sie mit 100% Effizienz verwendet werden. – TwoThe

3

Nun, das ist eine nette Frage und ich denke, die meisten Entwickler, die in der Web-Anwendungsentwicklung arbeiten, verwenden Multithreading nicht explizit. Der Grund ist ziemlich offensichtlich, da Sie einen Anwendungsserver verwenden, um Ihre Anwendung bereitzustellen, verwaltet der Anwendungsserver intern einen Thread-Pool für eingehende Anforderungen.

Warum Multithreading explizit verwenden? Was braucht ein Webanwendungsentwickler, um sich dem Multithreading auszusetzen?

Wenn Sie an einer großen Anwendung arbeiten, bei der Sie viele Anfragen gleichzeitig bearbeiten müssen, ist es schwierig, jede Art von Anfrage synchron zu bedienen, da eine bestimmte Art von Anfrage sehr viel Verarbeitung verursacht haben könnte .

Nehmen wir ein Beispiel, bei dem eine Webanwendung nach dem Versenden bestimmter Anfragen Benutzer per E-Mail und SMS benachrichtigen muss. Synchron mit dem Anforderungs-Thread kann die Leistung Ihrer Web-Anwendung beeinträchtigt werden. So kommt hier die Rolle des Mutlithreading. In solchen Fällen ist es ratsam, eine eigenständige Multithreadanwendung über das Netzwerk zu entwickeln, die nur für das Senden von E-Mails und SMS zuständig ist.

0

Multi-Tapping in Web-Anwendung kann verwendet werden, wenn Sie an parallelen Aktionen interessiert sind, z. B. Daten von mehreren Adressen abrufen.

Wie ich verstehe, Multithreading wird in anderen Situationen als Thread-Pool verwendet, die verwendet werden können, um Anfragen von mehreren Clients zu behandeln.