wake-up-neo.com

Dauerhafte Sitzungen und Sitzungsreplikation

Ich untersuche den Fall der Verwendung ständiger Sitzungen mit der Sitzungsreplikation in Tomcat. Nach meiner ersten Bewertung dachte ich, dass, wenn wir die Sitzungsreplikation aktivieren, die in einem Tomcat-Knoten gestartete Sitzung auf alle anderen Tomcat-Knoten kopiert wird. Daher benötigen wir keine ständigen Sitzungen, um die Sitzung fortzusetzen, und die Anforderung kann von jedem Knoten abgerufen werden .

Es scheint jedoch, dass die Sitzungsreplikation im Allgemeinen für ständige Sitzungen verwendet wird. Andernfalls muss die Sitzungs-ID geändert werden, wenn die Anforderung an einen anderen Knoten geht. ref: http://Tomcat.Apache.org/Tomcat-6.0-doc/cluster-howto.html#Bind_session_after_crash_to_failover_node

Kann mir jemand erklären, was die eigentliche Verwendung der Sitzungsreplikation ist, wenn Sie ständige Sitzung aktivieren müssen? Denn dann würden Sie die Sitzung auf jedem Knoten unnötig kopieren, wenn die Anforderung mit einer bestimmten Sitzungs-ID immer an denselben Knoten geht. Dies kann für den Fall eines Absturzes eines Knotens von Vorteil sein. Dies geschieht jedoch nicht häufig, und die Verwendung der Sitzungsreplikation nur für diesen scheint ein Overkill zu sein.

21
Ashish

Ich denke, der einzig wahre Vorteil ist, dass Tomcat-Instanzen ohne viel Nachdenken heruntergefahren werden können. Dies gilt insbesondere in der Cloud-Welt (denken Sie an Amazon AWS-Spot-Instanzen), wenn Knoten sehr oft ein- und ausgeschaltet werden können. Eine Alternative dazu wäre, einen anständigen Load-Balancer zu kaufen, der die Knotenentleerung unterstützt. Anständige Lastverteiler sind jedoch teuer und das Entleeren braucht Zeit.

Ein anderes Szenario, das mir einfällt, ist ein (mangelhafter Einsatz eines) Warenkorbs, in dem Artikel in der HttpSession aufbewahrt werden und das Herunterfahren den Benutzer dazu zwingen würde, sie erneut zu kaufen (was wahrscheinlich zu einem Verkaufsausfall führen würde).

In den meisten Fällen haben Sie jedoch recht - der Vorteil, dass sowohl ständige Sitzungen als auch die Sitzungsreplikation vorhanden sind, ist sehr vernachlässigbar.

8
mindas

Wie Mindas hat es vorher erklärt:

Wenn Sie den Lastausgleich verwenden, bedeutet dies, dass Sie mehrere Instanzen von Tomcat haben und die Lasten aufteilen müssen.

  • Wenn Sie die Sitzungsreplikation ohne ständige Sitzung verwenden: Stellen Sie sich vor, Sie haben nur einen Benutzer, der Ihre Web-App verwendet, und Sie haben 3 Tomcat-Instanzen. Dieser Benutzer sendet mehrere Anforderungen an Ihre App. Anschließend sendet Der Loadbalancer einige dieser Anforderungen an die erste Tomcat-Instanz Und einige andere dieser Anforderungen an die zweite Instanz und andere zum dritten.
  • Wenn Sie eine permanente Sitzung ohne Replikation verwenden: Stellen Sie sich vor, Sie haben nur einen Benutzer, der Ihre Web-App verwendet, und Sie haben 3 Tomcat-Instanzen (.____.). Dieser Benutzer sendet mehrere Anforderungen an Ihre App. Anschließend sendet der Loadbalancer die erste Benutzeranforderung an eine der drei Tomcat-Instanzen und alle anderen Anforderungen, die von diesem [.____. Der Benutzer wird während seiner Sitzung an dieselbe Tomcat-Instanz gesendet. Wenn Sie diese Tomcat-Instanz (Tomcat-Instanz, die verwendet wird) herunterfahren oder neu starten, sendet der Loadbalancer während dieser Anforderungen die verbleibende Anforderungen an eine andere Tomcat-Instanz, die noch ausgeführt wird, ABER wenn Sie keine Sitzungsreplikation verwenden, hat die Instanz Tomcat, die die restlichen Anforderungen empfängt, keine Kopie von Wenn die Benutzersitzung beginnt, beginnt der Benutzer für diesen Tomcat eine Sitzung: Der Benutzer verliert seine Sitzung und wird von der Web-App getrennt, obwohl die Web-App noch ausgeführt wird.
  • Wenn Sie eine permanente Sitzung MIT Sitzungsreplikation verwenden: Stellen Sie sich vor, Sie haben nur einen Benutzer, der Ihre Web-App verwendet, und Sie haben 3 Tomcat-Instanzen (.____.). Dieser Benutzer sendet mehrere Anforderungen an Ihre App. Anschließend sendet der Loadbalancer die erste Benutzeranforderung an eine der drei Tomcat-Instanzen und alle anderen Anforderungen, die von diesem [.____. Der Benutzer wird während seiner Sitzung an dieselbe Tomcat-Instanz gesendet. Wenn Sie diese Tomcat-Instanz (Tomcat-Instanz, die verwendet wird) herunterfahren oder neu starten, sendet der Loadbalancer während dieser Anforderungen die verbleibende Anforderungen an eine andere Tomcat-Instanz, die noch ausgeführt wird. Wenn Sie die Sitzungsreplikation verwenden, hat die Instanz Tomcat, die die verbleibenden Anforderungen empfängt, eine Kopie der Benutzersitzung und dann Der Benutzer bleibt in seiner Sitzung: Der Benutzer durchsucht Ihre Web-App , ohne die Verbindung zu trennen. Das Herunterfahren der Tomcat-Instanz hat keinen Einfluss auf die Navigation des Benutzers.
64
Nico

Zur Klärung von Konfigurationsproblemen unter JBoss 5.X in der "all" -Konfiguration mit mod_jk. Festlegen von ständigen Sitzungen in der Datei workers.properties

 worker.list=loadbalancer

 ... nodes configuration omitted

 worker.loadbalancer.balance_workers=node1,node2
 worker.loadbalancer.sticky_session=True

verhindert nicht die Sitzungsreplikation. Um die Sitzungsreplikation auf JBoss auszuschalten, müssen Sie den Parameter $ JBOSS_HOME\server\YOUR_NODE_NAME\deploy\cluster\jboss-cache-manager.sar\META-INF\jboss-cache-manager-jboss-beans.xml cacheMode einstellen zu LOCAL.

Normalerweise möchten wir in einem ständigen Sitzungsszenario keine Sitzungsreplikation, da wir keinen zusätzlichen Aufwand in Verbindung mit einer erheblichen Anzahl von E/A-Vorgängen benötigen, die zum Replizieren von Sitzungen erforderlich sind.

In der Tat, wenn Sie sich für permanente Sitzungen entscheiden, müssen Sie JBoss nicht in der Konfiguration "Alle" ausführen. Möglicherweise verwenden Sie eine "Standard" - oder "Standard" -Konfiguration. 

Das einzige, was getan werden muss, ist die Änderung in $ JBOSS_HOME/server/YOUR_NODE_NAME/deploy/jbossweb.sar/server.xml:

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="YOUR_NODE_NAME">
0