Moderne Anwendungen und Legacy-Anwendungen haben eine Eigenschaft gemeinsam, nämlich ob sie einen Zustand speichern oder nicht. Ob man es mit Monolithen oder Microservices zu tun hat, hängt von den Bedürfnissen der Anwendung ab. Einige müssen den Status (Nutzerverhalten) speichern, während andere sich nicht darum kümmern müssen.
Sogenannte zustandsbehaftete Anwendungen (stateful) speichern den Status von Client-Anfragen auf dem Server selbst und verwenden diesen Status, um weitere Anfragen zu verarbeiten. Sie verwenden eine Datenbank zum Speichern von Daten als Backend, aber die Sitzungsinformationen selbst werden auf dem Server gespeichert. Wenn ein Benutzer eine Login-Anfrage sendet, kann er sich anmelden und der Benutzer wird authentifiziert, und bei der zweiten Anfrage sieht der Benutzer das Dashboard. Stateful-Applikationen müssen keinen zweiten Aufruf an die Datenbank machen, da die Session-Informationen auf dem Server selbst gespeichert sind.
Der Vorteil dieser Art von Anwendungen besteht also in einer höheren Verarbeitungsgeschwindigkeit. Aber sie haben auch Nachteile. So gibt es in der Regel bei stateful applications einen Load Balancer (LB), hinter dem zwei Server stehen, auf denen die gleiche Anwendung läuft. Die erste Anfrage zum Einloggen geht an Server 1 und die zweite Anfrage könnte an Server 2 gehen; da nun nur der eine Server das Einloggen aktiviert hat, wird der Benutzer nicht in der Lage sein, sich anzumelden, wenn der Load Balancer den Request zum zweiten Server schickt. Es ist also nicht möglich, stateful Anwendungen horizontal zu skalieren.
Zustandslose Anwendungen (stateless) hingegen speichern keinen Status von Client-Anfragen auf dem Server, sondern ausschließlich in einer Datenbank. Diese wiederum ist zustandsbehaftet (stateful), d.h. sie verfügt über einen persistenten Speicher.
Typischerweise fordert ein Benutzer eine Anmeldung mit Anmeldeinformationen an, einer der Server verarbeitet die Anfrage, generiert ein Auth-Token, speichert es in der Datenbank und gibt das Token an den Client am Frontend zurück. Die nächste Anfrage wird zusammen mit dem Token gesendet. Das bedeutet: Egal, welcher Server die Anfrage verarbeitet – in jedem Fall wird das Token mit den Informationen in der Datenbank abgeglichen und dem Benutzer die Anmeldung gewährt. Jede Anfrage ist unabhängig und hat keine Verbindung zu vorherigen oder nächsten Anfragen, genau wie bei REST.
Obwohl zustandslose (stateless) Anwendungen einen zusätzlichen Overhead durch den Aufruf der Datenbank haben, sind diese Anwendungen erstaunlich gut horizontal skalierbar, was für moderne Anwendungen, die Millionen von Benutzern haben können, entscheidend ist.
Beide, stateful und stateless, sind heute allgegenwärtig. Aber moderne Software wird in der Regel als zustandslose Variante entwickelt, weil sie sich – anders als bei stateful Anwendungen – horizontal skalieren lässt – ein wesentliches Kriterium heutzutage unter anderem für den Einsatz von Microservices in Cloud-Umgebungen.
Die acht Hauptunterschiede zwischen Stateful und Stateless Anwendungen sind:
1. Arbeitszustand: Stateful-Applikationen reagieren nach dem aktuellen Zustand, während Stateless-Applikationen eigenständig unter Berücksichtigung der vorherigen/nächsten Anfrage agieren.
2. Gespeicherte Daten: Wenn der Webserver Daten im Backend speichert und sie dazu verwendet, den Benutzer als immer verbundenen Client zu identifizieren, ist der Dienst Stateful. Bei Stateless hingegen speichert der Server zwar Daten, aber in einer Datenbank, um den Benutzer/Client zu verifizieren, wann immer er eine Verbindung herstellen muss.
3. Reaktion gegenüber Clients: Bei Stateful denkt der Server, dass der Client nur eine dumme Maschine ist, während der Server bei Stateless denkt, dass der Client eine intelligente Maschine ist, die nicht von irgendeinem Zustand auf der Serverseite abhängig sein muss.
4. Anfragen: In Stateless sind Anfragen (Requests) in sich abgeschlossen, d.h. alles ist in der Anfrage enthalten und wird in zwei getrennten Phasen verarbeitet. („Anfrage“ / „Antwort“) Bei Stateful sind die Anfragen immer vom serverseitigen Zustand abhängig.
5. Generated State: Beim Browsen im Internet wird der Zustand generiert und irgendwo gespeichert. Obwohl dieses Benutzerverhalten in beiden Typen beim Speichern auf dem Server generiert wird, erzeugt dieser eine Sitzung. Dies wird eine Stateful-Anwendung genannt.
6. State Stored: Wenn das Verhalten des Clients gespeichert wird, erzeugt er einige Daten, die für weitere Anfragen verwendet werden, obwohl er technisch gesehen Stateful ist, da er auf einen Zustand verweist. Aber der Zustand wird vom Client gespeichert, daher nennt man ihn Stateless.
7. Cookie speichert: Auf der Client-Seite speichert das Cookie Authentifizierungsdaten. Auf der Server-Seite werden temporäre Client-Daten angelegt oder in einer Datenbank gespeichert (dies ist der typische Fall). Wenn der Nutzer zum Dashboard zurückkehrt, um eine weitere Zahlung vorzunehmen, ist es ein Cookie, das im Browser gespeichert wird und den Zustand mit dem Server herstellt.
8. User Base: Stateful ist Vergangenheit, als es Monolithen und keine dynamische Benutzerbasis gab. Stateless ist Zukunft, da Microservices im Umlauf sind und meist über REST-Schnittstellen kommunizieren und alles skalierbar ist, da kein Zustand gespeichert wird.
Wichtigste Vorteile von Stateless
1. Entfernt den Overhead zum Erstellen/Verwenden von Sitzungen.
2. Skaliert horizontal für die Bedürfnisse moderner Benutzer.
3. Neue Instanzen einer Anwendung werden bei Bedarf hinzugefügt/entfernt.
4. Ermöglicht Konsistenz über verschiedene Anwendungen hinweg.
5. Statelessness macht eine Anwendung komfortabler und wartbarer.
Zusätzliche Skalierungs- und Leistungsvorteile von zustandslosen Anwendungen:
1. Reduziert den Speicherverbrauch auf der Serverseite.
2. Eliminiert das Problem des Ablaufs von Sitzungen – Manchmal verursachen ablaufende Sitzungen Probleme, die schwer zu finden und zu testen sind. Zustandslose Anwendungen benötigen keine Sessions & und leiden daher nicht unter diesen Problemen.
3. Aus Sicht des Benutzers ermöglicht die Zustandslosigkeit, dass Ressourcen verlinkt werden können. Wenn eine Seite zustandslos (stateless) ist, wird sichergestellt, dass der Benutzer, wenn er einen Freund auf diese Seite verlinkt, die gleiche Ansicht wie ein anderer Benutzer sieht.
Quelle: Gursimran Singh, Home Healthcare Report, Oktober 2020