Implementieren Sie das serverlose Saga-Muster mithilfe von AWS Step Functions - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Implementieren Sie das serverlose Saga-Muster mithilfe von AWS Step Functions

Erstellt von Tabby Ward (AWS), Rohan Mehta () und Rimpy Tewani () AWS AWS

Umgebung: PoC oder Pilotprojekt

Technologien: Modernisierung; Serverlos

Arbeitslast: Open Source

AWSDienste: Amazon API Gateway; Amazon DynamoDB; AWS Lambda; Amazon; Step Functions SNS AWS

Übersicht

In einer Microservices-Architektur besteht das Hauptziel darin, entkoppelte und unabhängige Komponenten zu erstellen, um Agilität, Flexibilität und eine schnellere Markteinführung Ihrer Anwendungen zu fördern. Durch die Entkopplung verfügt jede Microservice-Komponente über eine eigene Datenpersistenzschicht. In einer verteilten Architektur können sich Geschäftstransaktionen über mehrere Microservices erstrecken. Da für diese Microservices keine einzige Transaktion mit Atomizität, Konsistenz, Isolation und Haltbarkeit (ACID) verwendet werden kann, kann es sein, dass es zu Teiltransaktionen kommt. In diesem Fall ist eine gewisse Kontrolllogik erforderlich, um die bereits verarbeiteten Transaktionen rückgängig zu machen. Zu diesem Zweck wird in der Regel das verteilte Saga-Muster verwendet. 

Das Saga-Muster ist ein Fehlermanagementmuster, das dazu beiträgt, Konsistenz in verteilten Anwendungen herzustellen und Transaktionen zwischen mehreren Microservices zu koordinieren, um die Datenkonsistenz aufrechtzuerhalten. Wenn Sie das Saga-Muster verwenden, veröffentlicht jeder Dienst, der eine Transaktion ausführt, ein Ereignis, das nachfolgende Dienste veranlasst, die nächste Transaktion in der Kette auszuführen. Dies wird fortgesetzt, bis die letzte Transaktion in der Kette abgeschlossen ist. Wenn eine Geschäftstransaktion fehlschlägt, orchestriert Saga eine Reihe von Ausgleichstransaktionen, die die Änderungen rückgängig machen, die durch die vorherigen Transaktionen vorgenommen wurden.

Dieses Muster zeigt, wie die Einrichtung und Bereitstellung einer Beispielanwendung (die Reisereservierungen abwickelt) mit serverlosen Technologien wie AWS Step Functions, AWS Lambda und Amazon DynamoDB automatisiert werden kann. Die Beispielanwendung verwendet auch Amazon API Gateway und Amazon Simple Notification Service (AmazonSNS), um einen Saga-Ausführungskoordinator zu implementieren. Das Muster kann mit einem Infrastructure-as-Code-Framework (IaC) wie dem AWS Cloud Development Kit (AWSCDK), dem AWS Serverless Application Model (AWSSAM) oder Terraform bereitgestellt werden.

Weitere Informationen zum Saga-Muster und anderen Datenpersistenzmustern finden Sie im Leitfaden Enabling data persistence in microservices auf der Prescriptive Guidance-Website. AWS

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto.

  • Berechtigungen zum Erstellen eines Stacks. AWS CloudFormation Weitere Informationen finden Sie in der CloudFormation Dokumentation unter Zugriffskontrolle.

  • Das IaC-Framework Ihrer Wahl (AWSCDK, AWSSAM, oder Terraform) ist mit Ihrem AWS Konto konfiguriert, sodass Sie das Framework CLI zur Bereitstellung der Anwendung verwenden können.

  • NodeJS, wird verwendet, um die Anwendung zu erstellen und lokal auszuführen.

  • Ein Code-Editor Ihrer Wahl (wie Visual Studio Code, Sublime oder Atom).

Produktversionen

Einschränkungen

Event Sourcing ist eine natürliche Methode, um das Saga-Orchestrierungsmuster in einer Microservices-Architektur zu implementieren, in der alle Komponenten lose miteinander verknüpft sind und keine direkte Kenntnis voneinander haben. Wenn Ihre Transaktion eine kleine Anzahl von Schritten (drei bis fünf) umfasst, ist das Saga-Muster möglicherweise hervorragend geeignet. Die Komplexität nimmt jedoch mit der Anzahl der Microservices und der Anzahl der Schritte zu. 

Das Testen und Debuggen kann schwierig werden, wenn Sie dieses Design verwenden, da alle Dienste ausgeführt werden müssen, um das Transaktionsmuster zu simulieren.

Architektur

Zielarchitektur

Die vorgeschlagene Architektur verwendet AWS Step Functions, um ein Saga-Muster zu erstellen, um Flüge zu buchen, Mietwagen zu buchen und Zahlungen für einen Urlaub zu verarbeiten.

Das folgende Workflow-Diagramm veranschaulicht den typischen Ablauf des Reisereservierungssystems. Der Workflow besteht aus der Reservierung von Flugreisen („ReserveFlight“), der Reservierung eines Autos („ReserveCarRental“), der Bearbeitung von Zahlungen („ProcessPayment“), der Bestätigung von Flugreservierungen („ConfirmFlight“) und der Bestätigung von Mietwagen („ConfirmCarRental“), gefolgt von einer Erfolgsmeldung, wenn diese Schritte abgeschlossen sind. Wenn das System jedoch bei der Ausführung einer dieser Transaktionen auf Fehler stößt, schlägt es rückwärts fehl. Beispielsweise löst ein Fehler bei der Zahlungsabwicklung („ProcessPayment“) eine Rückerstattung („RefundPayment“) aus, wodurch der Mietwagen und der Flug („CancelRentalReservation“ und „CancelFlightReservation“) storniert werden, wodurch die gesamte Transaktion mit einer Fehlermeldung beendet wird.

Dieses Muster stellt separate Lambda-Funktionen für jede im Diagramm hervorgehobene Aufgabe sowie drei DynamoDB-Tabellen für Flüge, Mietwagen und Zahlungen bereit. Jede Lambda-Funktion erstellt, aktualisiert oder löscht die Zeilen in den jeweiligen DynamoDB-Tabellen, je nachdem, ob eine Transaktion bestätigt oder zurückgesetzt wurde. Das Muster verwendet AmazonSNS, um Text (SMS) -Nachrichten an Abonnenten zu senden und sie über fehlgeschlagene oder erfolgreiche Transaktionen zu informieren. 

Arbeitsablauf für ein Reisereservierungssystem, das auf dem Saga-Muster basiert.

Automatisierung und Skalierung

Sie können die Konfiguration für diese Architektur mithilfe eines der IaC-Frameworks erstellen. Verwenden Sie einen der folgenden Links für Ihre bevorzugte IaC.

Tools

AWSDienstleistungen

  • AWSStep Functions ist ein serverloser Orchestrierungsdienst, mit dem Sie AWS Lambda-Funktionen und andere AWS Dienste kombinieren können, um geschäftskritische Anwendungen zu erstellen. In der grafischen Konsole von Step Functions sehen Sie den Workflow Ihrer Anwendung als eine Reihe von ereignisgesteuerten Schritten.

  • Amazon DynamoDB ist ein vollständig verwalteter Service ohne SQL Datenbank, der schnelle und vorhersehbare Leistung mit nahtloser Skalierbarkeit bietet. Sie können mit DynamoDB eine Datenbanktabelle erstellen, mit der eine beliebige Datenmenge gespeichert und abgerufen werden kann und der Anforderungsdatenverkehr verarbeitet werden kann.

  • AWSLambda ist ein Rechendienst, mit dem Sie Code ausführen können, ohne Server bereitzustellen oder zu verwalten. Lambda führt Ihren Code nur bei Bedarf aus und skaliert automatisch – von einigen Anforderungen pro Tag bis zu Tausenden pro Sekunde.

  • Amazon API Gateway ist ein AWS Service für die Erstellung, Veröffentlichung, Wartung, Überwachung und Sicherung RESTHTTP, und zwar WebSocket APIs in jeder Größenordnung.

  • Amazon Simple Notification Service (AmazonSNS) ist ein verwalteter Service, der die Nachrichtenzustellung von Verlagen an Abonnenten ermöglicht.

  • AWSCloud Development Kit (AWSCDK) ist ein Softwareentwicklungsframework zur Definition Ihrer Cloud-Anwendungsressourcen mithilfe vertrauter Programmiersprachen wie TypeScript,, Python JavaScript, Java und C#/.Net.

  • AWSServerless Application Model (AWSSAM) ist ein Open-Source-Framework für die Erstellung serverloser Anwendungen. Es bietet Kurzsyntax zum Ausdrücken von FunktionenAPIs, Datenbanken und Zuordnungen von Ereignisquellen.

Code

Den Code für eine Beispielanwendung, die das Saga-Muster demonstriert, einschließlich der IaC-Vorlage (AWSCDK, AWSSAM, oder Terraform), der Lambda-Funktionen und der DynamoDB-Tabellen, finden Sie unter den folgenden Links. Folgen Sie den Anweisungen im ersten Epos, um diese zu installieren.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Installieren Sie die NPM Pakete.

Erstellen Sie ein neues Verzeichnis, navigieren Sie in einem Terminal zu diesem Verzeichnis und klonen Sie das GitHub Repository Ihrer Wahl aus dem Codeabschnitt weiter oben in diesem Muster.

Führen Sie im Stammordner, der die package.json Datei enthält, den folgenden Befehl aus, um alle Node Package Manager (NPM) -Pakete herunterzuladen und zu installieren:

npm install
Entwickler, Cloud-Architekt

Kompilieren Sie Skripte.

Führen Sie im Stammordner den folgenden Befehl aus, um den TypeScript Transpiler anzuweisen, alle erforderlichen JavaScript Dateien zu erstellen:

npm run build
Entwickler, Cloud-Architekt

Achten Sie auf Änderungen und kompilieren Sie sie neu.

Führen Sie im Stammordner den folgenden Befehl in einem separaten Terminalfenster aus, um nach Codeänderungen zu suchen, und kompilieren Sie den Code, wenn eine Änderung erkannt wird:

npm run watch
Entwickler, Cloud-Architekt

Führen Sie Komponententests aus (AWSCDKnur).

Wenn Sie den verwenden AWSCDK, führen Sie im Stammordner den folgenden Befehl aus, um die Jest-Komponententests durchzuführen:

npm run test
Entwickler, Cloud-Architekt
AufgabeBeschreibungErforderliche Fähigkeiten

Stellen Sie den Demo-Stack bereit aufAWS.

Wichtig: Die Anwendung ist AWS regionsunabhängig. Wenn Sie ein Profil verwenden, müssen Sie die Region explizit entweder im AWSBefehlszeilenschnittstellenprofil (AWSCLI) oder über Umgebungsvariablen deklarieren. AWS CLI

Führen Sie im Stammordner den folgenden Befehl aus, um eine Bereitstellungsassembly zu erstellen und sie für das AWS Standardkonto und die Region bereitzustellen.

AWS CDK:

cdk bootstrap cdk deploy

AWS SAM:

sam build sam deploy --guided

Terraform:

terraform init terraform apply

Dieser Schritt kann mehrere Minuten dauern. Dieser Befehl verwendet die Standardanmeldeinformationen, die für den konfiguriert wurden AWSCLI.

Notieren Sie sich URL das API Gateway, das nach Abschluss der Bereitstellung auf der Konsole angezeigt wird. Sie benötigen diese Informationen, um den Saga-Ausführungsablauf zu testen.

Entwickler, Cloud-Architekt

Vergleichen Sie den bereitgestellten Stack mit dem aktuellen Status.

Führen Sie im Stammordner den folgenden Befehl aus, um den bereitgestellten Stack mit dem aktuellen Status zu vergleichen, nachdem Sie Änderungen am Quellcode vorgenommen haben:

AWS CDK:

cdk diff

AWS SAM:

sam deploy

Terraform:

terraform plan
Entwickler, Cloud-Architekt
AufgabeBeschreibungErforderliche Fähigkeiten

Testen Sie den Ausführungsablauf der Saga.

Navigieren Sie zu dem API GatewayURL, das Sie im vorherigen Schritt bei der Bereitstellung des Stacks notiert haben. Dadurch URL wird die Zustandsmaschine gestartet. Weitere Informationen darüber, wie Sie den Fluss der Zustandsmaschine manipulieren können, indem Sie verschiedene URL Parameter übergeben, finden Sie im Abschnitt Zusätzliche Informationen.

Um die Ergebnisse anzusehen, melden Sie sich bei der AWS Management Console an und navigieren Sie zur Step Functions Functions-Konsole. Hier können Sie jeden Schritt der Saga State Machine sehen. Sie können auch die DynamoDB-Tabelle anzeigen, um die eingefügten, aktualisierten oder gelöschten Datensätze zu sehen. Wenn Sie den Bildschirm häufig aktualisieren, können Sie beobachten, wie sich der Transaktionsstatus von pending zu ändert. confirmed 

Sie können das SNS Thema abonnieren, indem Sie den Code in der stateMachine.ts Datei mit Ihrer Handynummer aktualisieren, um SMS Nachrichten über erfolgreiche oder fehlgeschlagene Reservierungen zu erhalten. Weitere Informationen finden Sie bei Amazon SNS im Abschnitt Zusätzliche Informationen.

Entwickler, Cloud-Architekt
AufgabeBeschreibungErforderliche Fähigkeiten

Ressourcen bereinigen.

Um die für diese Anwendung bereitgestellten Ressourcen zu bereinigen, können Sie einen der folgenden Befehle verwenden.

AWS CDK:

cdk destroy

AWS SAM:

sam delete

Terraform:

terraform destroy
App-Entwickler, Cloud-Architekt

Zugehörige Ressourcen

Technische Dokumente

AWSServicedokumentation

Tutorials

Zusätzliche Informationen

Code

Zu Testzwecken stellt dieses Muster API Gateway und eine Test-Lambda-Funktion bereit, die die Step Functions Functions-Zustandsmaschine auslöst. Mit Step Functions können Sie die Funktionalität des Reisereservierungssystems steuern, indem Sie einen run_type Parameter übergeben, um Fehler in „ReserveFlight,“ „ReserveCarRental,“ „ProcessPayment,“ und „ConfirmFlight“ nachzuahmenConfirmCarRental.

Die saga Lambda-Funktion (sagaLambda.ts) nimmt Eingaben von den Abfrageparametern im API Gateway entgegenURL, erstellt das folgende JSON Objekt und übergibt es zur Ausführung an Step Functions:

let input = { "trip_id": tripID, // value taken from query parameter, default is AWS request ID "depart_city": "Detroit", "depart_time": "2021-07-07T06:00:00.000Z", "arrive_city": "Frankfurt", "arrive_time": "2021-07-09T08:00:00.000Z", "rental": "BMW", "rental_from": "2021-07-09T00:00:00.000Z", "rental_to": "2021-07-17T00:00:00.000Z", "run_type": runType // value taken from query parameter, default is "success" };

Sie können mit verschiedenen Abläufen der Step Functions Functions-Zustandsmaschine experimentieren, indem Sie die folgenden URL Parameter übergeben:

  • Erfolgreiche Ausführung ─ https://{api gateway url}

  • Flug reservieren gescheitert ─ https://{api Gateway-URL}? runType= failFlightsReservation

  • Flugfehler bestätigen ─ https://{api Gateway-URL}? runType= failFlightsConfirmation

  • Mietwagen-Reservierung ist fehlgeschlagen ─ https://{api Gateway-URL}? runType= failCarRental Reservierung

  • Bestätigen Sie, dass die Autovermietung fehlgeschlagen ist ─ https://{api Gateway-URL}? runType= failCarRental Bestätigung

  • Zahlungsvorgang fehlgeschlagen ─ https://{api Gateway-URL}? runType= failPayment

  • Eine Reise-ID weitergeben ─ https://{api Gateway-URL}? TripId= {Standardmäßig ist die Reise-ID die AWS Anfrage-ID}

IaC-Vorlagen

Die verknüpften Repositorien enthalten IaC-Vorlagen, mit denen Sie den gesamten Musterantrag für Reisereservierungen erstellen können.

DynamoDB-Tabellen

Hier sind die Datenmodelle für die Tabellen mit Flügen, Mietwagen und Zahlungen.

Flight Data Model: var params = { TableName: process.env.TABLE_NAME, Item: { 'pk' : {S: event.trip_id}, 'sk' : {S: flightReservationID}, 'trip_id' : {S: event.trip_id}, 'id': {S: flightReservationID}, 'depart_city' : {S: event.depart_city}, 'depart_time': {S: event.depart_time}, 'arrive_city': {S: event.arrive_city}, 'arrive_time': {S: event.arrive_time}, 'transaction_status': {S: 'pending'} } }; Car Rental Data Model: var params = { TableName: process.env.TABLE_NAME, Item: { 'pk' : {S: event.trip_id}, 'sk' : {S: carRentalReservationID}, 'trip_id' : {S: event.trip_id}, 'id': {S: carRentalReservationID}, 'rental': {S: event.rental}, 'rental_from': {S: event.rental_from}, 'rental_to': {S: event.rental_to}, 'transaction_status': {S: 'pending'} } }; Payment Data Model: var params = { TableName: process.env.TABLE_NAME, Item: { 'pk' : {S: event.trip_id}, 'sk' : {S: paymentID}, 'trip_id' : {S: event.trip_id}, 'id': {S: paymentID}, 'amount': {S: "750.00"}, // hard coded for simplicity as implementing any monetary transaction functionality is beyond the scope of this pattern 'currency': {S: "USD"}, 'transaction_status': {S: "confirmed"} } };

Lambda-Funktionen

Die folgenden Funktionen werden erstellt, um den Zustandsmaschinenfluss und die Ausführung in Step Functions zu unterstützen:

  • Flüge reservieren: Fügt einen Datensatz mit einem transaction_status of in die DynamoDB-Flugtabelle einpending, um einen Flug zu buchen.

  • Flug bestätigen: Aktualisiert den Datensatz in der DynamoDB-Flugtabelle, um ihn auf einzustellenconfirmed, transaction_status um den Flug zu bestätigen.

  • Flugreservierung stornieren: Löscht den Datensatz aus der DynamoDB-Flugtabelle, um den ausstehenden Flug zu stornieren.

  • Mietwagen reservieren: Fügt einen Datensatz mit einem transaction_status of in die CarRentals DynamoDB-Tabelle einpending, um eine Autovermietung zu buchen.

  • Autovermietungen bestätigen: Aktualisiert den Datensatz in der CarRentals DynamoDB-Tabelle, um ihn auf zu setzenconfirmed, transaction_status um die Autovermietung zu bestätigen.

  • Mietwagenreservierung stornieren: Löscht den Datensatz aus der CarRentals DynamoDB-Tabelle, um die ausstehende Autovermietung zu stornieren.

  • Zahlung verarbeiten: Fügt einen Datensatz für die Zahlung in die DynamoDB-Zahlungstabelle ein.

  • Zahlung stornieren: Löscht den Datensatz für die Zahlung aus der DynamoDB-Zahlungstabelle.

Amazon SNS

Die Beispielanwendung erstellt das folgende Thema und Abonnement für das Senden von SMS Nachrichten und die Benachrichtigung des Kunden über erfolgreiche oder fehlgeschlagene Reservierungen. Wenn Sie beim Testen der Beispielanwendung Textnachrichten empfangen möchten, aktualisieren Sie das SMS Abonnement mit Ihrer gültigen Telefonnummer in der State-Machine-Definitionsdatei.

AWSCDKSnippet (fügen Sie die Telefonnummer in der zweiten Zeile des folgenden Codes hinzu):

const topic = new sns.Topic(this, 'Topic'); topic.addSubscription(new subscriptions.SmsSubscription('+11111111111')); const snsNotificationFailure = new tasks.SnsPublish(this ,'SendingSMSFailure', { topic:topic, integrationPattern: sfn.IntegrationPattern.REQUEST_RESPONSE, message: sfn.TaskInput.fromText('Your Travel Reservation Failed'), }); const snsNotificationSuccess = new tasks.SnsPublish(this ,'SendingSMSSuccess', { topic:topic, integrationPattern: sfn.IntegrationPattern.REQUEST_RESPONSE, message: sfn.TaskInput.fromText('Your Travel Reservation is Successful'), });

AWSSAMSnippet (ersetze die +1111111111 Zeichenketten durch deine gültige Telefonnummer):

StateMachineTopic11111111111: Type: 'AWS::SNS::Subscription' Properties: Protocol: sms TopicArn: Ref: StateMachineTopic Endpoint: '+11111111111' Metadata: 'aws:sam:path': SamServerlessSagaStack/StateMachine/Topic/+11111111111/Resource

Terraform-Snippet (ersetze die +111111111 Zeichenfolge durch deine gültige Telefonnummer):

resource "aws_sns_topic_subscription" "sms-target" { topic_arn = aws_sns_topic.topic.arn protocol = "sms" endpoint = "+11111111111" }

Erfolgreiche Reservierungen

Der folgende Ablauf veranschaulicht eine erfolgreiche Reservierung mit „ReserveFlight,“ „ReserveCarRental,“ und „ProcessPayment“, gefolgt von „ConfirmFlight“ und „“ConfirmCarRental. Der Kunde wird durch SMS Nachrichten, die an den Abonnenten des SNS Themas gesendet werden, über die erfolgreiche Buchung informiert.

Beispiel für eine erfolgreiche Reservierung, die von Step Functions mithilfe des Saga-Musters implementiert wurde.

Fehlgeschlagene Reservierungen

Dieser Ablauf ist ein Beispiel für einen Fehler im Saga-Muster. Wenn „ProcessPayment“ nach der Buchung von Flügen und Mietwagen fehlschlägt, werden die Schritte in umgekehrter Reihenfolge storniert.  Die Reservierungen werden freigegeben und der Kunde wird durch SMS Nachrichten, die an den Abonnenten des SNS Themas gesendet werden, über den Fehler informiert.

Beispiel für eine fehlgeschlagene Reservierung, die von Step Functions mithilfe des Saga-Musters implementiert wurde.