Ich bin sicher, dass die meisten von uns auf die eine oder andere Weise schon einmal Probleme mit der Dateninkonsistenz in einem Softwaresystem hatten. Wenn man zum Beispiel einen Geldautomaten bedient, um Geld abzuheben, kommt es h?ufig vor, dass Transaktionen aus verschiedenen Gr¨¹nden fehlschlagen. Es kann sein, dass der Geldautomat das Geld nicht ausgibt, obwohl der Saldo auf den Konten abgezogen wird. Wenn Kunden den Fehler im System melden, antwortet die Bank in der Regel, dass es 60 Minuten bis 24 Stunden dauern wird, bis der fehlerhafte Transaktionsdatensatz behoben ist. Dies ist ein typischer Fall von Dateninkonsistenz, bei dem der Geldautomat und der Bankserver f¨¹r einen kurzen Zeitraum nicht synchronisiert sind.
Nehmen wir einen anderen Fall einer Rechnungszahlung ¨¹ber eine Handy-App. Der Nutzer veranlasst die Zahlung, die App stellt eine sichere Verbindung zur Bankschnittstelle her, die Zahlung wird verarbeitet und an die Schnittstelle des H?ndlers weitergeleitet, um die Zahlung zu best?tigen. Angenommen, die Website des H?ndlers ist in diesem Moment nicht verf¨¹gbar. Nun bleibt die Transaktion f¨¹r einen kurzen Zeitraum unvollst?ndig, bis sich die App-Server mit der Schnittstelle des H?ndlers synchronisiert haben.
In beiden F?llen sind die Dateninkonsistenzen darauf zur¨¹ckzuf¨¹hren, dass bestimmte Teile des Systems nicht verf¨¹gbar sind, Dienste nicht reagieren, netzwerkbedingte Fehler auftreten usw. Diese Faktoren sind in gro?en verteilten Softwaresystemen sehr h?ufig. Auch wenn das System im Laufe der Zeit Konsistenz herstellt, ist ein nahtloser und reibungsloser Ablauf f¨¹r den Endbenutzer nicht sicher.
91Ô´´
Die Microservices-Architektur verfolgt einen verteilten Ansatz, bei dem jeder Dienst bzw. jede Funktion einer Software in hohem Ma?e unabh?ngig ist, eine bestimmte Gesch?ftsgrenze oder einen definierten Kontext hat, von der Existenz anderer Dienste wissen kann oder nicht, seine eigenen Daten verwalten kann, verschiedene Speichermechanismen verwenden kann und m?glicherweise in verschiedenen Programmiersprachen verfasst und von separaten Teams gepflegt wird.
Die Microservices-Architektur verwendet einen dezentralen Ansatz und ist stark von der Natur inspiriert. Microservices sind eine beliebte Wahl f¨¹r den Aufbau gro?er Unternehmenssysteme geworden. Mit dem Aufkommen der Cloud, der elastischen Datenverarbeitung und -speicherung sowie der Containertechnologie und der Orchestrierungsmechanismen gibt es einen enormen Anstieg bei der Erstellung von Anwendungen im Stil der Microservices-Architektur.
91Ô´´
Inzwischen haben Sie vielleicht schon herausgefunden, dass die Microservices-Architektur aufgrund ihrer starken Bef¨¹rwortung eines dezentralen Datenansatzes die Datenkonsistenz in den Systemen f?rdert. Es w?re jedoch unklug zu glauben, dass die monolithische Softwarearchitektur diese Probleme nahtlos l?st. Sie haben ihre eigenen Gefahren.
Es ist daher unerl?sslich, dass die Entwickler von Microservices diese Probleme ber¨¹cksichtigen und sich der Herausforderungen bewusst sind, die sich bei der Datenkonsistenz einschleichen k?nnen. Die unten aufge´Ú¨¹³ó°ù³Ùen Techniken helfen bei der Verwaltung der eventuellen Konsistenz in Microservices.
Saga-Muster
Transaktionen, die sich ¨¹ber mehrere Dienste erstrecken, werden als eine Saga/Kette einfacher lokaler atomarer Transaktionen auf jeder Dienstebene betrachtet. So schlie?t ein Dienst seine Transaktion ab und setzt sie fest, benachrichtigt den n?chsten Dienst in der Kette mit einem Ereignis/einer Nachricht, um die n?chste lokale Transaktion auszul?sen, und so weiter und so fort. Wenn eine Transaktion in dieser Kette aus irgendeinem Grund fehlschl?gt, l?st sie im Grunde eine R¨¹ckg?ngigmachung aus, die in der Kette nach hinten ´Ú¨¹³ó°ù³Ù. Es ist daher zwingend erforderlich, bei der Entwicklung der Architektur Musterfehler zu ber¨¹cksichtigen.
Das Saga-Muster geht zwar auf eventuelle Konsistenzprobleme ein, ist aber eher f¨¹r kleinere verteilte Architekturen als f¨¹r gro?e geeignet. Die Entwickler m¨¹ssen auch ber¨¹cksichtigen, dass Kompensationsaufrufe/Transaktionen auch fehlschlagen k?nnen. Daher ist es f¨¹r einfachere und kleine verteilte Architekturen geeignet.
?nderungsdatenerfassung (CDC)
CDC ist zwar im Data Warehousing fest verwurzelt und wird dort ausgiebig praktiziert, kann aber auch f¨¹r das Design von Microservices ¨¹bernommen werden, um sicherzustellen, dass die Transaktionen die 91Ô´´ konsistent ¨¹berspannen.
Das Grundprinzip bleibt im Kern gleich. Ein Dienst l?st, nachdem seine lokale Transaktion in die lokale DB ¨¹bertragen wurde, einen separaten Prozess aus, der einen Change Capture Record erstellt und den Change Capture Record an den n?chsten Dienst weitergibt. Dieser Dienst nimmt den Change-Capture-Datensatz des vorherigen Dienstes auf, verarbeitet ihn, ¨¹bertr?gt ihn in seine lokale DB und erstellt in einem separaten Prozess seinen eigenen neuen Change-Capture-Datensatz, den er an die n?chste Gruppe von Diensten weitergibt.
Auf diese Weise kann dieser Change-Capture-Datensatz durch die verteilten Dienste propagiert werden, bis alle Dienste synchronisiert sind, ohne dass die Orchestrierung ¨¹berm??ig belastet wird.
M?glichkeiten zur Implementierung von CDC in Microservices:
Verwendung von Datenbank-Transaktionsprotokollen: Viele Datenbanken bieten Betriebsprotokolle und Transaktionsprotokolle. Durch Scannen des Inhalts dieser Protokolle und Interpretation der ?nderungen kann man die an der Datenbank vorgenommenen ?nderungen identifizieren. Dies kann der ?nderungserfassungssatz sein, der an den n?chsten Dienst weitergegeben wird.
Verwendung von Kafka Connect und Apache Kafka: Die in einem Dienst erfassten DB-?nderungen k?nnen mit einem Kafka-Connecter verbunden werden, der die ?nderungen an die verschiedenen Kafka-Themen weiterleitet, damit die Abonnenten sie konsumieren und umsetzen k?nnen.
CDC eignet sich im Allgemeinen f¨¹r gro?e verteilte Architekturen, da es nicht leistungsintensiv ist und leicht aktiviert werden kann, ohne dass zus?tzliche ?nderungen am Schema vorgenommen werden m¨¹ssen. CDC hat von Natur aus eine geringere Latenzzeit und erm?glicht es nachgelagerten Datenbanken, die ?nderungen schnell zu verfolgen. Es besteht auch die M?glichkeit, den von den Diensten empfangenen ?nderungsfeed als Stream zu verarbeiten.
Der gr??te Nachteil, den die Entwickler bei CDC sehen, ist jedoch die Unflexibilit?t bei der ?nderung des Schemas der Dienste. Dadurch wird die Entwicklung des DB-Schemas der Dienste in gewissem Ma?e blockiert. Die ?nderung des Schemas in einem Dienst l?st ?nderungen in allen nachgelagerten Diensten aus.
Neben diesen beiden M?glichkeiten gibt es noch mehrere andere Wege, um eine Datensynchronisation durch CDC zu erreichen, die von Cloud-Infrastrukturanbietern implementiert wurden.
Nachdem wir zwei g?ngige Ans?tze zur Erreichung von Datenkonsistenz und -integration und deren Nachteile kennengelernt haben, wollen wir nun eine v?llig neue Perspektive und ein neues Paradigma zur Betrachtung des Themas Datenkonsistenz betrachten... "Akzeptieren Sie die Inkonsistenz" - Nicht alle Softwaresysteme/Teile des Systems m¨¹ssen die Daten synchronisieren und immer konsistent sein. Spulen wir zur¨¹ck zu unserem Beispiel der Geldabhebung durch einen Geldautomaten. Wir alle haben die Dateninkonsistenz hier akzeptiert und warten darauf, dass das System ¨¹ber einen gewissen Zeitraum hinweg konsistent wird.
Viele Gesch?ftssysteme sind toleranter ²µ±ð²µ±ð²Ô¨¹²ú±ð°ù Dateninkonsistenzen als allgemein angenommen. Das liegt daran, dass Unternehmen mehr Wert auf die ³Õ±ð°ù´Ú¨¹²µ²ú²¹°ù°ì±ð¾±³Ù von Diensten legen und damit Geld verdienen , was zu der lang anhaltenden Debatte ¨¹ber die Bevorzugung von BASE ²µ±ð²µ±ð²Ô¨¹²ú±ð°ù ACID in vielen Unternehmenssystemen ´Ú¨¹³ó°ù³Ù .
BASE ist ein Akronym f¨¹r Basically Available, SoftState und EventualConsistency
ACID ist ein Akronym f¨¹r Atomicity, Consistent, Isolatedund Durable
Dies steht im Einklang mit dem bekannten CAP-Theorem, das besagt, dass ein verteilter Datenspeicher nicht mehr als zwei der drei folgenden Garantien gleichzeitig bieten kann: Konsistenz, ³Õ±ð°ù´Ú¨¹²µ²ú²¹°ù°ì±ð¾±³Ùund Partitionstoleranz.
Daher bevorzugen Softwaresysteme je nach Bedarf entweder BASE ²µ±ð²µ±ð²Ô¨¹²ú±ð°ù ACID oder umgekehrt, um Teile des Systems konsistent zu halten.
F¨¹hlen Sie sich frei, Ihre Kommentare, Ihr Feedback und Ihre Fragen zu diesem Artikel zu hinterlassen. Ich werde versuchen, jede dieser Fragen so schnell wie m?glich zu beantworten.