Heute mal wieder etwas aus der Kategorie Absonderlichkeiten von CFMX 6.1 auf J2EE-Servern…
Man nehme einen J2EE-Server (zum Beispiel BEA WLS 7) und betreibe diesen in einem Cluster. Der Cluster besteht aus zwei Instanzen (ist aber letztlich egal) und in jeder Instanz läuft genau ein CFMX 6.1 Server. Session-Handling ist in CFMX auf J2EE-Sessions gestellt und ich arbeite mit dem Session-Scope.
Idee des ganzen ist, dass ein ankommender Request beim ersten Aufruf nach Round Robin verteilt wird und danach sticky wird, d.h. mit Hilfe des JSESSIONID-Cookies und des BEA-Session-Handlings immer auf dem gleichen Rechner des Clusters landet (also auch auf dem gleichen ColdFusion-Server).
Bei einem Ausfall eines der Rechner wäre es jetzt schon, wenn der andere dann die Sessions übernehmen würde und weiter betreiben könnte. Da in BEA das Session-Handling auf “replicating” steht, ist dieses Verhalten auch zu erwarten.
Denkste. Das wäre zu einfach 😉
Die Filekonfiguration sieht ungefähr so aus:
Maschine A
Application.cfm
<cfapplication> name=”testapp” sessionmanagement=”yes”>
index.cfm
<cfset session.name = “Kai A”>
output.cfm
<cfoutput>#session.name#</cfoutput>
Maschine B
analog zu Maschine A, nur die index.cfm ändert sich:
index.cfm
<cfset session.name = “Kai B”>
Beide BEA-Instanzen und beide CFMX-Server laufen. Ich nehme mir zwei Rechner und requeste den Cluster solange, bis ich auf je einem Client auf Maschine A lande und mit dem anderen Client auf Maschine B. Dazu muss man ggf. mehrmals den Browser schliessen, da man ja eine 50/50-Chance hat, auf Server X zu landen.
Dann fahre ich Maschine A herunter. Der Client, der auf Server B hängt, hängt dort auch weiterhin. Der andere Client requestet auf Server A (über den Cluster), dieser merkt, dass der Server ausgefallen ist und leitet auf B um. BANG und Fehler!
Beim CFAPPLICATION-Tag der Application.cfm bliebt CFMX hängen und beschwert sich, dass ein “undefined value” vorliege. Er kommt also nicht einmal bis zum eigentlichen Zugriff auf die Session-Variable.
In der Stack Trace findet man einen Verweis auf die Klasse coldfusion.runtime.J2eeSessionScope kurz bevor die Stack Trace wieder an die WebLogic-Instanz zurückgibt. Interessanterweise findet sich dazu bei Google ein interessanter Link, der aber nicht da eigentliche Problem schildert, jedoch eine Lösung anbietet: Entfernen des Name-Parameters im CFAPPLICATION-Tag – weil dann die Session-Variablen von CFMX direkt der Klasse HTTPSession des J2EE-Servers zugeordnet werden und somit der Server-Failover funktioniert.
Ich habe das nicht geglaubt, aber es funktioniert wirklich. Lässt man im CFAPPLICATION-Tag den Parameter weg, klappt alles wunderbar. Je nachdem welchen Cluster-Node man herunterfährt, wird die Session munter hin- und hergeschoben und ohne Probleme mit den aktuellen Inhalten dargestellt.
Strange! Ich möchte noch gar nicht wissen, was das für Komplikationen nach sich zieht…
Comments on this entry are closed.