Verteilte Anwendungen werden normalerweise für den Einsatz in heterogenen Netzen entwickelt. Die miteinander kommunizierenden Systeme (Clients, Server, Legacy) stehen in voneinander logisch oder physikalisch isolierten Adressräumen, die über eine Netzwerkinfrastruktur miteinander verbunden sind. Häufig ist das Internet Bestandteil dieser Infrastruktur, die als wide area network (WAN) bezeichnet wird. Praktisch immer erfolgt die Entwicklung und der Test solcher Anwendungen in einem lokalen Netzwerk (LAN, locale area network), hier stehen die zu entwickelnden Anwendungskomponenten und die Anwendungsinfrastruktur in ein und demselben Adressraum. Aus Entwicklersicht ist der Charakter des Netzwerks unwichtig, ein im LAN entwickeltes Anwendungssystem lässt sich normalerweise problemlos auch in einem WAN deployen. Aus Betriebs- und Anwendersicht ist das nicht so, hier sind wesentliche Unterschiede zu berücksichtigen. Dieser Artikel beschreibt aus der Sicht des Architekten die Auswirkungen dieser Unterschiede auf die Anwendungsentwicklung.
Zunächst einmal sind die wesentlichen Unterschiede zwischen LAN und WAN festzuhalten:
Client -> ServerIn einem WAN sind die Verhältnisse potenziell komplizierter. Hier sind entlang der Kommunikationsstrecke diverse Infrastrukturkomponenten zu passieren. Selbst unter Vernachlässigung der Komponenten, die auf den OSI-Schichten 1-4 agieren (Switches, Router, Hubs) und die im allgemeinen aus Anwendungssicht vollkommen transparent ihren Dienst tun, bleiben noch Komponenten, die auf den OSI-Schichten 5-7 arbeiten (Firewalls, Gateways, Content-Switches, Proxies, Reverse Proxies). Hier gibt es tatsächlich Berührungspunkte zur Anwendungsentwicklung, denn diese Komponenten arbeiten auf Protokollebene:
Client -> Proxy -> Firewall --- WAN --- Firewall -> Reverse Proxy -> Server
Für viele Anwendungsprotokolle wird Netzwerkkommunikation auf der Basis des paketorientierten IP über die darüber liegenden Protokolle TCP (verbindungsorientiert) und UDP (datenorientiert) abgewickelt. Eine Netzwerkverbindung kostet einen belegten Socket, einen wartenden Thread und alle daran gebundenen Hilfsressourcen (Buffer, Semaphoren etc.). Der Aufbau einer TCP/UDP Connection kostet zusätzlich mindestens einen Roundtrip für das Handshake. Wird eine Verbindung SSL gesichert sind zudem noch ein weiterer Roundtrip und CPU-Ressourcen auf beiden Seiten der Verbindung nötig (slow-start Problem). Das Halten einer TCP/UDP Verbindung kostet Ressourcen, der Aufbau einer TCP/UDP Verbindung kostet Zeit und zusätzliche Ressourcen. Das gilt für alle in der Verbindung beteiligten Netzwerk-Infrastrukturkomponenten! Wie häufig eine Verbindung aufgebaut und wie lange sie gehalten wird ist offensichtlich eine wesentliche Designentscheidung. Connection-Management, also das planvolle Öffnen, Nutzen und wieder Freigeben von TCP/UDP Connections ist hier wesentliches Architekturziel. Es folgen Grundregeln:
Latenz und Verbindungsabbrüche
Verbindungen im WAN sind prinzipiell fehleranfällig und die Latenz einer Verbindung kann prinzipiell nicht vorhergesagt werden. Anwendungen sind für dieses Szenario auszulegen und zu testen.
Bandbreiten sind in WAN begrenzt, können Kosten verursachen und werden zeitlich variieren.
Aus Netzwerk-Perspektive sind RPC (remote procedure calls) immernoch eine teure Angelegenheit. RPC-Frameworks verschleiern den relativ hohen Aufwand, der bei Methodenaufrufen über Systemgrenzen hinweg entsteht, gerade dafür sind sie ja gemacht. In einem WAN kann dann der unreflektierte Einsatz von RPC zu substantiellen Problemen führen.
Rolle der Proxies und Reverse Proxies
Proxies arbeiten auf den OSI-Schichten 5-7. Sie optimieren Kommunikation, indem sie Kommunikationsprotokolle und zum Teil auch die Nutzdaten analysieren und "intelligent" reagieren. Daneben können sie für Querschnittsaufgaben eingesetzt werden, dazu zählen beispielsweise Caching von Daten, Contentfilter- und Loggingfunktionen. Proxy-taugliche Clients können in verteilten Umgebungen erheblich zur Entlastung der Netzwerkressourcen beitragen und sind gegebenenfalls für den Einsatz mit einem Proxy auszulegen. Ein Client ist proxytauglich, wenn er das Protokoll des verwendeten Proxy beherrscht. Populäre Standards sind HTTP-Proxy- und SOCKS-Protokolle.
Reverse Proxies arbeiten ebenfalls auf den OSI-Schichten 5-7. Sie nehmen Anfragen von Clients entgegen, analysieren Protokoll- und Nutzdaten und leiten die Anfrage an passende Server weiter. Aus Clientsicht ist ein Reverse Proxy damit ein einheitlicher Zugriffspunkt auf mehrere Server, die zumeist über URL-Bestandteile adressiert werden. Daneben kann ein Reverse Proxy für Querschnittsaufgaben eingesetzt werden, dazu zählen beispielsweise Loadbalancing, Caching von Daten, Terminierung der Verschlüsselung, Authentifizierung und Datentransformation. Eine Anwendung ist Reverse Proxy tauglich, wenn sie die URL-Bestandteile zur Adressierung der einzelnen Dienste protokollgerecht benutzt. Speziell für statisches und dynamisches HTML bedeutet dies konkret, dass die URLs des eigenen Dienstes grundsätzlich relativ (statt absolut) zu formulieren sind, eine Regel, die ohnehin als best practice anzusehen ist. Clientseitig dynamisch erstellte URLs (zum Beispiel mit der Hilfe AJAX-Frameworks) sind entsprechend kritisch und im Einzelfall zu würdigen.