[JAVA] Der Typ, der die Sitzungsreplikation mit Tomcat durchführt

Was tun Sie mit Sitzungsinformationen, wenn Sie eine Java-Webanwendung, die Tomcat verwendet, automatisch skalieren? Also habe ich nachgeschlagen.

Cluster Tomcat

Getreu den Grundlagen.

Eine Methode zum Einrichten eines Clusters in Tomcat und zum Durchführen der Sitzungsreplikation. Sie verwenden nur Multicast, um eine Cluster-Mitgliedschaft zu bilden, oder? Dieses Mal habe ich versucht, die AWS-Umgebung zu verwenden, also bin ich hier festgefahren. Der Multiplikator ist innerhalb der VPC beschränkt.

Ich befürchte, dass Oracle Cloud und IBM Bluemix hier Java-freundlich aufgebaut sind, aber was ist damit?

Verwenden Sie Amazon DynamoDB Session Manager für Apache Tomcat

Dann nutzen Sie doch die von AWS bereitgestellte Bibliothek. : Kirschen:

https://github.com/amazon-archives/aws-dynamodb-session-tomcat

Dies scheint eine Erweiterung des persistenten Managers zu sein, der einer der von Tomcat standardmäßig bereitgestellten Sitzungsmanager ist.

Persistent Manager bietet die Funktion zum Speichern von Sitzungsinformationen in einem externen Speicher. Wenn Sie damit den Speicherort der Sitzung vom Speicher in DynamoDB ändern, scheint es sich um eine zustandslose Anwendung zu handeln, und eine automatische Skalierung ist möglich. Ist es?

Leider wurde es archiviert und wird nicht mehr aktualisiert. Wie erwartet wollte ich es von nun an vermeiden, es zu übernehmen, und entschied mich daher, es zu verwenden, da die README-Datei mich aufforderte, stattdessen "memcached-session-manager" zu verwenden.

Verwenden Sie memcached-session-manager

https://github.com/magro/memcached-session-manager

Nehmen Sie die Einstellungen vor, während Sie die SetupAndConfiguration-Wiki-Seite in der README-Datei lesen. Schließlich lautet die Definition des Kontexts wie folgt. Ich tat.

META-INF/context.xml (Auszug)


	<Manager
		className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
		memcachedNodes="redis://redis" sticky="false"
		sessionBackupAsync="false"
		lockingMode="auto"
		requestUriIgnorePattern=".*/uptime_check.html$" />

Änderungen gegenüber dem Beispiel

Ändern Sie lockingMode in auto

Es scheint, dass dieses Attribut verhindern soll, dass Sitzungen gleichzeitig geändert werden, weil Ajax, das Durchsuchen von Registerkarten usw. und Aktualisierungen verloren gehen.

Sie können eine URL angeben, für die dies mit einem regulären Ausdruck möglich ist. Da es diesmal jedoch schwierig war, genau anzugeben, wo sie sich mit der Zielanwendung befand, habe ich sie auf "auto" gesetzt.

Es wird gesagt, dass dies bei einer Anforderung, die "schreibgeschützt" ist, nicht gesperrt wird, aber speziell auf die Sitzung überhaupt nicht zugegriffen wurde (`HttpSession # getAttribute ()` und HttpSession # setAttribute " Es scheint, dass der Fall () nicht erledigt wurde) das Ziel ist.

Ändern Sie requestUriIgnorePattern

Wenn die URL der Anforderung mit dem durch dieses Attribut angegebenen regulären Ausdruck übereinstimmt, kann der Prozess des Speicherns der Sitzung in der speicherinternen Datenbank anscheinend übersprungen werden.

Für die Seite (uptime_check.html), auf der der Load Balancer eine Integritätsprüfung durchführt, werden keine Sitzungsinformationen generiert. Daher habe ich sie als Überspring-URL festgelegt, um unnötige Verarbeitung zu vermeiden.

Außerdem wurde der Zugriff auf statische Dateien wie in Beispiel zunächst festgelegt, da die Sitzung irrelevant ist. Diesmal hat sich die Ziel-App jedoch unerwartet verhalten, sodass ich beschlossen habe, sie zu ändern.

Die Zielanwendung wurde entwickelt, um ServletFilter auch für statische Dateien zu übergeben. In dieser Bibliothek ist es jedoch neu, wenn `HttpServletRequest # getSession ()` in einer Anforderung aufgerufen wird, die mit requestUriIgnorePattern übereinstimmt. Die Implementierung bestand darin, eine Sitzung zu generieren, die dazu führte, dass die Sitzungs-ID bei jedem Zugriff auf eine statische Datei gewechselt wurde und das Verhalten der App seltsam war.

Einstellen von sessionBackupTimeout

Nach einer kleinen Last tritt nun ein Timeout-Fehler auf. Vorerst habe ich es auf ca. 1,5 Sekunden verlängert und das Problem wurde gelöst, aber ich bezweifle, dass es in Ordnung ist. : Denken:

30-Oct-2018 07:04:51.146 WARNING [http-nio-8080-exec-1] de.javakaffee.web.msm.BackupSessionTask.handleException Could not store session 3EE38D05C62D287516AD504BFCBD572D in memcached.
Note that this session was relocated to this node because the original node was not available.
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask.get(FutureTask.java:205)
at de.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:235)
at de.javakaffee.web.msm.BackupSessionTask.doBackupSession(BackupSessionTask.java:198)
at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:119)
at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:50)
at de.javakaffee.web.msm.BackupSessionService$SynchronousExecutorService.submit(BackupSessionService.java:345)
at de.javakaffee.web.msm.BackupSessionService.backupSession(BackupSessionService.java:204)
at de.javakaffee.web.msm.MemcachedSessionService.backupSession(MemcachedSessionService.java:1098)
at de.javakaffee.web.msm.RequestTrackingHostValve.backupSession(RequestTrackingHostValve.java:232)
at de.javakaffee.web.msm.RequestTrackingHostValve.invoke(RequestTrackingHostValve.java:161)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

Sitzungs-ID-Konflikt

Beim Generieren einer Sitzungs-ID durchsucht Tomcat den Speicher und wird neu generiert, wenn die Sitzungs-ID in Konflikt steht.

Diese Bibliothek scheint die Sitzungsinformationen aus dem Speicher zu löschen und in der speicherinternen Datenbank zu speichern, sodass die Sitzungs-ID möglicherweise nicht eindeutig ist. Ich war besorgt.

… Der Autor kollidiert nicht so sehr, deshalb ist mir das zu wichtig. Sagst du (GitHub-Probleme)

Recommended Posts

Der Typ, der die Sitzungsreplikation mit Tomcat durchführt
Der Typ, der mit Kotlin mit Ressourcen versucht
Der Typ, der mit Kotlin mit Ressourcen versucht
Versuchen Sie es mit der Stream-API in Java
Der Typ, der die Sitzungsreplikation mit Tomcat durchführt
Ihnen, denen im Feld "Keine Stream-API verwenden" mitgeteilt wurde
Ein beschissener Typ, der Layoutanpassungen bei der Entwicklung von libGDX nüchtern und effizient vornimmt