© S-F/Shutterstock.com
Reconciliation statt klassischem sequenziellem Programmentwurf

Versöhnt euch!


In verteilten Systemen ist Fehlerbehandlung oft aufwendig und schwierig. Jeder Aufruf zu einem externen System kann schiefgehen und muss daher separat behandelt, wiederholt und überwacht werden. Sollte ein Aufruf in einer Sequenz von Operationen so fehlschlagen, dass er nicht auf der Stelle behoben werden kann, muss die gesamte Sequenz neu gestartet werden. Bereits erfolgreiche Aufrufe werden ausgelassen.

Als Alternative zur klassischen sequenziellen Bearbeitung steht das Reconciliation-Programmiermodell. Hier wird der gewünschte Zielzustand zunächst definiert und vom Reconciler kontinuierlich mit dem aktuell vorherrschenden Zustand verglichen. Diese Vergleiche geschehen in einer Endlosschleife, dem Reconciliation-Loop. Sollte während diesem Vergleich eine Differenz zwischen aktuellem und Zielzustand auftreten, wird der Reconciler den nächstmöglichen Schritt in Richtung des Zielzustandes ausführen. Im nächsten Durchlauf kann der Reconciler prüfen, ob er noch warten muss, oder ob dieser Schritt bereits erfolgreich beendet wurde und er den nächsten Schritt in Richtung des Zielzustandes ausführen kann.

Motivation

Schauen wir uns das Ganze einmal anhand eines einfachen Beispiels an. Unser Code soll den Client eines Cloudanbieters verwenden, um ein Neo4j-Cluster zu starten. Wenn das erledigt ist, wird ein Speicherort (Bucket) erstellt, in dem Back-ups abgelegt werden können. Danach werden Firewallregeln konfiguriert: Das Neo4j-Cluster soll von außerhalb zugänglich sein, die Neo4j-Cluster sollen auch auf den Back-up-Bucket zugreifen können. Eigentlich ist das ein nicht allzu komplexer Prozess. Einen naiven Ansatz, ihn zu implementieren, können wir uns in Listing 1 anschauen. Für die drei Arbeitspakete, die wir erledigen müssen, haben wir jeweils eine Zeile Code verwendet. Zuerst erstellen wir das Cluster. Den Rückgabewert dieses Aufrufes verwenden wir, um den Back-up-Bucket einzurichten. Die bisherigen Rückgabewerte dienen dazu, die Firewall korrekt zu konfigurieren.

Listing 1: Naiver Ansatz in Python

def setup_cloud_neo4j_cluster(client: GoogleClient, neo4j_version: str): neo4j_cluster = client.create_neo4j_cluster(neo4j_version) buckets = client.setup_backup_buckets(neo4j_cluster) client.configure_firewall_rules(neo4j_cluster, buckets)

Transaction Script – von oben nach unten

Martin Fowler nennt dieses Muster das Transaction Script und beschreibt es folgendermaßen: „The transaction script organizes business logic by procedures where each procedure handles a...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang