Frage

Wir haben ein Servlet, die auf dem Server aufgrund der Logik hat es mehr virtuelle Speicher belegt. Aus diesem Grunde würden wir die gleichzeitigen Zugriffe auf diesen Server zum Beispiel sagen, beschränken gerne würden wir wollen nur 10 gleichzeitige Anfragen verarbeitet. Die anderen Anträge haben in der Warteschlange warten.

Kann ein benutzerdefinierter Threadpool wird für dieses Servlet erstellt und ordnen Sie dieses Szenario zu behandeln? Wir sind mit WebLogic Server 9.2. Oder gibt es einen anderen besseren Ansatz, dies zu tun? Schätzen Sie irgendwelche Gedanken.

War es hilfreich?

Lösung

  

Kann ein benutzerdefinierter Threadpool wird für dieses Servlet erstellt und ordnen Sie dieses Szenario zu behandeln? Wir sind mit WebLogic Server 9.2. Oder gibt es einen anderen besseren Ansatz, dies zu tun? Schätzen Sie irgendwelche Gedanken.

Ja, das ist möglich. Anstatt die Standardselbstoptimierung Arbeit-Manager (beginnend mit 9.x Weblogic, führen Warteschlangen werden durch Arbeit Manager für Thread-Pools ersetzt 1 ), können Sie einen Arbeits Manager mit spezifischen erstellen Zwänge wie die max-threads-constraint und möglicherweise der capacity. Sie können dann ein Servlet zu einem bestimmten Arbeits Manager weisen Sie die wl-Versand-Politik der weblogic.xml Deployment Descriptor-Datei.


1 Beachten Sie, dass es noch möglich ist, auf WebLogic 8.1 Thread-Pool Modell aktiviert und Warteschlangen ausführen zu können.

Andere Tipps

Sie brauchen etwas vor oder das Gerät die Servlet-Hosting, weil, wenn die Anforderungen der Maschine getroffen, ist es etwas zu spät ist: Ressourcen sind bereits im Einsatz. Sie kann nicht die Nachfrage steuern Seite: Sie können nur auf sie und planen für sie reagieren können,

.

Sie müssen wahrscheinlich einen Lastenausgleich entweder Software oder Hardware je nach Zielanforderungen. Die Software Load-Balancer kann einfach ein "Dispatcher Servlet" sein mit Sitzungssteuerung (zum Beispiel 10 gleichzeitigen X Servlet).

Es gibt eine andere Möglichkeit: Sie „Gas“ die Anforderer durch eine entsprechende HTTP-Code ausgibt. Natürlich bedeutet dies eine zusätzliche Logik auf der anfordernden Seite ... und verbraucht noch einig Ressourcen auf der Server-Seite.

Sie könnten Lastenausgleich so, dass es ein sekundärer Server, die alle Anforderungen für das teuere Servlet verarbeitet.

Sie können einen statischen Zähler haben, und ein Servlet, das als Gateway zu dem teueren Methodenaufruf nur wirkt. Sie müssen nur mit einer wahrscheinlich Race-Bedingung auf diesem statischen Zähler behandeln.

So würden Sie Ihre aktuelle Servlet in einem Methodenaufruf drehen.

Dann wird das Gateway-Servlet die Anfrage bekommen, ob der Zähler niedrig genug ist, und dann erhöht. Wenn mehr als 10, dann wieder eine Fehlermeldung aus.

Dies ist keine ideale Situation, aber wenn man die Dinge in eine Warteschlange gestellt, dann wird Browser nach einer Weile Timeout beginnen, oder Benutzer ungeduldig und klicken Sie auf die Absenden-Button immer und immer wieder, da es zu lange dauert.

Wenn Sie Javascript verwenden, könnte die Anfrage zu senden, dann gibt es einige bessere Lösungen, die Ihnen helfen können.

Ohne Verwendung Last-Balancern usw., wie es mir scheint, dass Sie die Anforderung von der Verarbeitung entkoppeln wollen.

z.

  1. sendet der Browser eine Anfrage. Das Servlet dauert es, reiht es und gibt ein Ticket zurück.
  2. Das Servlet auf dieser Arbeitsanforderung als Ressourcen erlauben arbeiten (einen separaten Thread Pool Ziehen der Arbeit Elemente aus der Warteschlange verwendet wird).
  3. Der Browser kann aktualisieren (Re-GET) mit dem Ticket und das Servlet wird wieder ein entsprechendes Ergebnis (zum Beispiel nicht die Verarbeitung, Verarbeitung, verarbeitet).

Das ist ganz ein gemeinsames Muster. Beachten Sie, dass der Browser nicht gesperrt, sondern lediglich die Anforderung sendet und führt dann regelmäßig überprüft, ob das Workitem abgeschlossen ist. Ich habe dies (zum Beispiel) erfolgreich eingesetzt in der Situation, wo ich Benutzer für Diagramme gefragt hatte, die 5 Minuten oder länger dauern, zu verarbeiten, und die verwendeten eine native Bibliothek, die nicht wurde Thread-sicher. In diesem Szenario I had , um die Verarbeitung zu einem einzigen Thread zu beschränken, unabhängig von der Anzahl der gleichzeitigen Anfragen.

Ich mag die Idee der Verwendung von statischen Zähler und Umleitung eine Fehlermeldung angezeigt wird, wenn der Zähler über eine Grenze erreicht hat.

Könnten wir konfigurieren einen separaten Servlet und konfigurieren Sie den Thread-Pool nur X Anzahl von gleichzeitigen Anforderungen, alle anderen Anfragen in der Warteschlange platziert werden würde, um die nächste verfügbare Servlet zu verwenden. Ist dieser Ansatz einen Timeout-Fehler werfen? Können Sie mir bitte weitere Informationen rund um das teilen? Dank

http://download.oracle.com /docs/cd/E13222_01/wls/docs92/perform/appb_queues.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top