Frage

Es gibt Lastenausgleich tomcat Web-Servern. Jede Anforderung kann durch verschiedene Tomcatbediener bedient werden.

Wie könnten wir diese während kümmern sich um die j2ee (Streben) basierte Web-Anwendung Code zu schreiben?

War es hilfreich?

Lösung

Zu allererst Sie wollen Ihre Load Balancer für Sitzungsaffinität / sticky Sitzungen einzurichten, so dass es alle Anforderungen an den gleichen Tomcat weiter Weiterleiten (solange es liegt), basierend auf JSESSIONID.

der Tomcat-Clustering doc zwei wichtige Anforderungen besagt, Ihre Anwendung erfolgreich haben, es Sitzungen repliziert:

  • Alle Ihre Sitzungsattribute müssen implementieren java.io.Serializable
  • Stellen Sie sicher, dass Ihr web.xml das <distributable/> Element oder an Ihrem <Context distributable="true" /> gesetzt

Wenn Sie Objekte in Session starten setzen, die nicht implementieren Serializable (oder bei denen Eigenschaften / Felder, die Serializable nicht implementieren), dann Probleme haben Sie gehen.

(Tatsächlich sind diese Punkte alle gelten unabhängig davon, welche Servlet-Container Sie verwenden, glaube ich.)

Update:. , um einige der Fragen in den Kommentaren zu adressieren, warum Sticky Sessions verwenden, wenn Sie die Last zwischen mehreren Servern balancieren, ich denke, es ist am einfachsten, dies mit einem Beispiel zu erklären

Vor allem diese zählen nur wirklich, wenn Ihre Anwendung eine Art von Daten in-Sitzung hält, das nicht jede einzelne Anwendung sein kann (obwohl es wahrscheinlich die meisten). Wenn Sie in-Session-Daten nicht halten, dann werden Sie wahrscheinlich nicht kümmern uns um irgendetwas davon und man kann einfach aufhören hier zu lesen.

Mit einer Umgebung, in der Sie Daten in der Sitzung halten, aber Sie tun nicht hat klebrige Sitzung würde eine Welt von Kopfschmerzen eröffnen.

Lassen Sie uns sagen first.jsp aktualisiert einen Wert in einer bestimmten Sitzung Attribut und second.jsp geschieht das gleiche Session-Attribut zu lesen. Sie können Tomcat eingerichtet, um Sitzungsdaten auf alle Server im Cluster repliziert werden, aber diese Replikation tritt nicht sofort. Was passiert, wenn die ursprüngliche Anforderung für first.jsp von server1 und einer Nanosekunde behandelt wird, nachdem es abgeschlossen ist, macht der gleiche Besucher eine Anfrage an second.jsp, die in Ihrer nicht-klebrigen Umgebung von server2 behandelt wird. Da die Replikation nicht augenblicklich ist, Sie haben keine Möglichkeit zu wissen, wenn Sie die meisten up-to-date Datensitzung lesen? Haben Sie irgendeine Art von Logik fügen Sie Ihre liest über den Cluster zu synchronisieren? Dies würde riesiger Schmerz.

Einrichten von Sitzungsaffinität / sticky Sitzungen beseitigt diese Kopfschmerzen; durch alle Anfragen vom selben Client-Server mit dem gleichen Knoten, müssen Sie sich keine Sorgen darüber „ist dieser Knoten auf dem neuesten Stand der Zeit, die die Anforderung verarbeitet?“ Wenn der Knoten ausfällt, kann der Kunde nach wie vor in dem Cluster auf einem anderen Knoten Failover, die eine Kopie davon die Sitzungsdaten, aber mit klebrigen Sitzungen in dieser wird der seltene Fall und nicht die Norm.

Es gibt einen weiteren Grund, klebrigen Sitzungen zu wollen: Last zwischen den Knoten im Cluster. Wenn eine Anforderung in einer Sitzung von einem beliebigen Knoten behandelt werden könnte, bedeuten, dass wäre dann, dass Sie all-to-all-Replikation im Cluster (dh die Sitzungsdaten von node1 eingerichtet ist replcated zu Knoten2, node3, ..., Knoten N, werden die Sitzungsdaten von node2 zu node1 repliziert, node3, ... keine N, etc). All-to-all-Sitzung Replikation kann Bandbreite werden und ressourcenintensiv, wenn der Cluster größer wird, weil jeder neben dem Cluster bedeutet einen weiteren Knoten, der mit jeder anderen einzelnen Knoten im Cluster kommunizieren muss.

Eine Alternative dazu ist ein Datum nur ein paar „Freunde“ replizierte des Knotens haben im Cluster, so im Fall, dass der Knoten es Daten nicht an anderer Stelle verfügbar ist, aber ohne jeden einzelnen Knoten eine Kopie müssen. In diesem Szenario würden Sie den Cluster so konfigurieren, dass node1 es die Daten repliziert Knoten 2 und 3, Knoten 2 hat es die Daten repliziert Knoten 3 und 4 usw., eine Kette bilden. In diesem Szenario, das Hinzufügen weiterer Knoten zum Cluster verursacht nicht die amount der Kommunikation zwischen den Knoten schnell zu erhöhen, wie es funktioniert in einem All-to-All-Schema.

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