Ich entwickel fast alles mit einer Kombination aus Apache + Tomcat + Datenbank (mysql oder postgresql).
Für eine neue Webapp wollte ich mal Websockets ausprobieren.
Websockets ist ein HTML5-Feature, das momentan nur von den neuesten Browsern unterstützt wird. Sie bieten den Vorteil, eine Verbindung zu öffnen (und diese offen zu halten), damit man keine Mechanismen wie HTTP-Long-Polling benötigt, um Server-Pushs zu ermöglichen. Stattdessen schickt der Server einfach über die offene Verbindung Daten an den Client. Sehr praktisch!
Ein weiterer großer Vorteil ist, dass die Websockets nicht der same-origin-policy unterliegen, wie es bei AJAX der Fall ist. D.h. AJAX-Anfragen kann man nur an den Server der gleichen Domain stellen, aber man kann keine Anfragen irgendwohin anders stellen. Das ist oft hinderlich.
Leider sind Websockets sehr neu, weshalb es da etliche Probleme gibt.
Zuallererst muss der Application-Server Websockets unterstützen. Tomcat7 kann das. Man muss nur aufpassen, dass ein Interface der Api von Version 7.0.28 auf 7.0.30 geändert wurde, sodass die Version wichtig ist. Leider handelt es sich um das MessageInbound-Interface, das essenziell für die Websockets ist.
Ich hab da einige Zeit gesucht, bis ich herausgefunden habe, warum mein Tomcat eine Abstract-Class-Exception liefert, obwohl ich sauber die abstrakten Methoden implementiert hatte.
Das Problem lag daran, dass auf meinem Server die Tomcat-Version 7.0.28 lief, während meine Maven-Tomcat-Plugin-Version 7.0.30 verwendet. Ja, das hat es ausgemacht …
Weiterhin muss man wissen, dass man normale HTTPServlets nicht verwenden kann, d.h. man muss an seiner Tomcat-App auf jeden Fall etwas ändern. Man benötigt eine Klasse des Typs WebsocketServlet. Der Rest ist fast gleich …
Weiteres Problem war Apache … Apache unterstützt immer noch keine Websockets, dafür gibt es irgendwelche Selbstkompilate, die man als Module in den Server hängen kann. Viel zu kompliziert … mod_proxy kann eine Websocket-Verbindung jedenfalls nicht weiterleiten, weil es die Header entfernt. Websocket setzt auf HTTP auf und hat ein paar Header mehr, die dem Apachen nicht gefallen. Er stript sie einfach raus und das wars. Schon funktioniert es nicht mehr.
Die Lösung war, den veralteten Apachen einzustampfen und durch ein modernen NGINX zu ersetzen. NGINX ist ein sehr moderner Webserver, der nicht nur light-weight ist, sondern auch nicht mehr auf forken sondern auf threading basiert. Forken ist natürlich einfacher, weil wenn der Prozess abstürzt, dann ist der Hauptprozess weiterhin am Leben. Das ist bei NGINX schwieriger, denn die Threads laufen alle innerhalb eines Prozesses. Aber dafür ist er Resourcenfreundlicher und schneller 🙂
Ich war überrascht, wie schnell NGINX konfiguriert war. Websockets haben damit quasi sofort funktioniert.
Tjo, das war meine Erfahrung damit und jetzt funktioniert es …
Ich wollte NGINX eh mal testen und jetzt hab ich die Gelegenheit dazu 🙂
Erstaunt war ich nur, dass ich von jeder Software die neueste Version brauchte, die teilweise noch nicht mal in Debian-Testing ist …