Architekturen verteilter Anwendungen

Ein erster Überblick.

Dozent:

Prof. Dr. Michael Eichberg

Kontakt:

michael.eichberg@dhbw-mannheim.de, Raum 149B

Version:

2024-05-09

Folien:

https://delors.github.io/ds-architekturen/folien.rst.html

https://delors.github.io/ds-architekturen/folien.rst.html.pdf

Fehler auf Folien melden:

https://github.com/Delors/delors.github.io/issues

Grundlegende Architekturen

Architekturstile (Architectural Styles)

Ein Architekturstil wird formuliert in Form von

Konnektor

Ein Mechanismus, der die Kommunikation, Koordination oder Kooperation zwischen Komponenten vermittelt. Beispiel: Einrichtungen für (entfernte) Prozeduraufrufe (RPC), Nachrichtenübermittlung oder Streaming.

Schichtenarchitekturen

images/common_application_architectures/n-layered_architectures.svg
images/common_application_architectures/n-layered_architectures-jump_over_layers.svg
images/common_application_architectures/n-layered_architectures-and-callbacks.svg

Beispiel einer 3-Schichtenarchitektur

images/common_application_architectures/3-layered-example.svg

Klassische Architekturen

images/common_application_architectures/common_architectures.svg

Traditionelle Dreischichtenarchitektur

Diese Architektur findet sich in vielen verteilten Informationssystemen mit traditioneller Datenbanktechnologie und zugehörigen Anwendungen.

Publish and Subscribe Architekturen

Abhängigkeiten zwischen den Komponenten werden durch das Publish and Subscribe Paradigma realisiert mit dem Ziel der loosen Kopplung.

Taxonomie der Koordinierungsansätze in Hinblick auf Kommunikation und Koordination:

Zeitlich gekoppelt

Zeitlich entkoppelt

Referentiell gekoppelt

Direkt Koordination

Mailboxkoordination

Referentiell entkoppelt

ereignisbasierte Koordination

(Event-based Coordination)

gemeinsam genutzter Datenspeicher

(Shared Data Space)

Ereignisbasierte Koordination

images/pubsub/event-based.svg

Shared Data Space

images/pubsub/shared-data-space.svg

Häufig wird die ereignisbasierte Koordination in Kombination mit Shared Data Space zur Realisierung von Publish and Subscribe Architekturen.

Direkte Koordination

Ein Prozess interagiert unmittelbar (⇒ zeitliche Kopplung) mit genau einem anderen wohl-definierten Prozess (⇒ referentielle Kopplung).

Mailboxkoordination

Die miteinander kommunizierenden Prozesse interagieren nicht direkt miteinander, sondern über eine eindeutige Mailbox (⇒ referentielle Kopplung). Dies ermöglicht es, dass die Prozesse nicht zeitgleich verfügbar sein müssen.

Ereignisbasierte Koordination

Ein Prozess löst Ereignisse aus, auf die irgendein anderer Prozesse direkt reagiert. Ein Prozess, der zum Zeitpunkt des Auftretens des Ereignisses nicht verfügbar ist, sieht das Ereignis nicht.

Gemeinsam genutzter Datenspeicher

Prozesse kommunizieren über Tuples, die in einem gemeinsam genutzten Datenspeicher hinterlegt werden. Ein Prozess, der zum Zeitpunkt des Schreibens nicht verfügbar ist, kann das Tuple später lesen. Prozesse definieren Muster in Hinblick auf die Tuples, die sie lesen wollen.

Aufbau von Cloud Computing Anwendungen

images/cloud.svg

Es können vier Schichten unterschieden werden:

Microservices [Newman2021]

Microservice mit REST Schnittstelle

Microservices

Ein einfacher Microservice, der eine REST Schnittstelle anbietet und Ereignisse auslöst.

Wo liegen hier die Herausforderungen?

images/microservices/basisbeispiel.svg

Eine große Herausforderung ist das Design der Schnittstellen. Um wirkliche Unabhängigkeit zu erreichen, müssen die Schnittstellen sehr gut definiert sein. Sind die Schnittstellen nicht klar definiert oder unzureichend, dann kann das zu viel Arbeit und Koordination zwischen den Teams führen, die eigentlich unerwünscht ist!

Schlüsselkonzepte von Microservices

Microservices und Conway's Law

Traditionelle Schichtenarchitektur

images/microservices/aenderungen-bei-klassischer-architektur.svg

Microservices Architektur

images/microservices/aenderungen-bei-microservices-architektur.svg

Microservices und Technologieeinsatz

Microservices sind flexibel bzgl. des Technologieeinsatzes und ermöglichen den Einsatz der geeignetsten Technologie.

images/microservices/technologische-flexibilitaet.svg

Aktuelle Standardtechnologien

screenshots/tiobe_2012-04.png

Quelle: TIOBE Programming Community Index - April 2012

Microservices und Skalierbarkeit

Sauber entworfene Microservices können sehr gut skaliert werden.

images/microservices/skalierbarkeit.svg

Microservices und Transaktionen

Implementierung einer langlebigen Transaktion?

images/sagas/transaktion.svg

Die Implementierung von Transaktionen ist eine der größten Herausforderungen bei der Entwicklung von Microservices.

Transaktionen mit Hilfe von Sagas

Aufteilung einer langlebigen Transaktion mit Hilfe von Sagas

images/sagas/transaktion-mit-saga.svg

Eine Saga ist eine Sequenz von Aktionen, die ausgeführt werden, um eine langlebige Transaktion zu implementieren.

Sagas können keine Atomizität garantieren. Jedes System für sich kann jedoch ggf. Atomizität garantieren (z. B. durch die Verwendung traditioneller Datenbanktransaktionen).

Sollte ein Abbruch der Transaktion notwendig sein, dann kann kein traditioneller Rollback erfolgen. Die Saga muss dann entsprechende kompensierende Transaktionen durchführen, die alle bisher erfolgreich durchgeführten Aktionen rückgängig machen.

Optimierung der Abarbeitungsreihenfolge zwecks Minimierung von mgl. Rollbacks

images/sagas/transaktion-mit-saga-mit-weniger-rollbacks.svg

Die Abarbeitungsreihenfolge der Aktionen kann so optimiert werden, dass die Wahrscheinlichkeit von Rollbacks minimiert wird. In diesem Falle ist die Wahrscheinlichkeit, dass es zu einem Rollback während des Schritts Versand der Bestellung kommt, wesentlich höher als beim Schritt Kundenbonus gutschreiben.

Langlebige Transaktionen mit orchestrierten Sagas

images/sagas/orchestrierte-saga.svg

Die orchestrierte Saga ist eine Möglichkeit, um langlebige Transaktionen zu implementieren.

Langlebige Transaktionen mit choreografierten Sagas

images/sagas/choreographierte-saga.svg

Ein großes Problem bei choreografierten Sagas ist es den Überblick über den aktuellen Stand zu behalten. Durch die Verwendung einer "Korrelations-ID" kann diese Problem gemindert werden.

Dual-write Problem

images/dual-write/no-crash-no-problem.svg

An welcher Stelle könnte es zu einem Problem kommen?

images/dual-write/crash.svg

Lösungsideen

  • 2PC ist im Kontext von Microservices keine Option (zu langsam, zu komplex)

  • Änderung der Reihenfolge der Aktionen (1. publish dann 2. update) führt noch immer zu Inkonsistenzen

  • die Event Processing Middleware (synchron) zu notifizieren - d. h. als Teil des Datenbankupdates - ist auch keine Option:

    • Was passiert, wenn die Middleware nicht erreichbar ist?

    • Was passiert, wenn das Event nicht verarbeitet werden kann?

Strikte Konsistenz ist nicht erreichbar.

Dual-write Problem - Outbox Pattern

images/dual-write/outbox-pattern.svg

(eine) Lösung: Outbox Pattern

  • Die Aktionen werden (zusätzlich) in einer Outbox-Tabelle gespeichert und dann asynchron verarbeitet.

  • Damit kann Eventual Consistency erreicht werden.

Die Wahl der richtigen Architektur ist ein Tradeoff!

Die Wahl der Softwarearchitektur ist immer eine Abwägung von vielen Tradeoffs!

Weitere Aspekte, die berücksichtigt werden können/müssen:

Literatur

[Newman2021]

Sam Newman, Building Microservices: Designing Fine-Grained Systems, O'Reilly, 2021.