Implementieren Sie das Serverless-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 Serverless-Saga-Muster mithilfe von AWS Step Functions

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

Umgebung: PoC oder Pilotprojekt

Technologien: Modernisierung; Serverless; Cloudnativ

Workload: Open-Source

AWS-Services: Amazon API Gateway; Amazon DynamoDB ;AWS Lambda ;Amazon SNS ;AWS Step Functions

Übersicht

In einer Microservices-Architektur besteht das Hauptziel darin, entkoppelte und unabhängige Komponenten zu erstellen, um Agilität, Flexibilität und schnellere Markteinführungszeit für Ihre Anwendungen zu fördern. Aufgrund der Entkopplung hat jede Microservice-Komponente ihre eigene Datenpersistenzschicht. In einer verteilten Architektur können sich Geschäftstransaktionen über mehrere Microservices erstrecken. Da diese Microservices keine einzige Atomizitäts-, Konsistenz-, Isolations- und Haltbarkeitstransaktion (ACID) verwenden können, können Teiltransaktionen auftreten. In diesem Fall ist eine gewisse Steuerlogik erforderlich, um die bereits verarbeiteten Transaktionen rückgängig zu machen. Das verteilte Saga-Muster wird normalerweise für diesen Zweck verwendet. 

Das Saga-Muster ist ein Fehlerverwaltungsmuster, 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 Service, der eine Transaktion durchführt, ein Ereignis, das nachfolgende Services auslöst, um die nächste Transaktion in der Kette durchzufü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 Sie die Einrichtung und Bereitstellung einer Beispielanwendung (die Reisereservierungen verarbeitet) mit Serverless-Technologien wie AWS Step Functions ,AWS Lambda und Amazon DynamoDB automatisieren. Die Beispielanwendung verwendet auch Amazon API Gateway und Amazon Simple Notification Service (Amazon SNS), um einen Saga-Ausführungskoordinator zu implementieren. Das Muster kann mit einem Infrastructure as Code (IaC)-Framework wie dem AWS Cloud Development Kit (AWS CDK), dem AWS Serverless Application Model (AWS SAM) oder Terraform bereitgestellt werden.

Weitere Informationen zum Saga-Muster und anderen Datenpersistenzmustern finden Sie im Leitfaden Aktivieren der Datenpersistenz in Microservices auf der Website AWS Prescriptive Guidance.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto.

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

  • IaC-Framework Ihrer Wahl (AWS-CDK, AWS SAM oder Terraform), das mit Ihrem AWS-Konto konfiguriert ist, sodass Sie die Framework-CLI verwenden können, um die Anwendung bereitzustellen.

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

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

Produktversionen

Einschränkungen

Event Sourcing ist eine natürliche Möglichkeit, das Saga-Orchestrierungsmuster in einer Microservices-Architektur zu implementieren, in der alle Komponenten lose gekoppelt sind und keine direkten Kenntnisse übereinander haben. Wenn Ihre Transaktion eine kleine Anzahl von Schritten (drei bis fünf) umfasst, könnte das Saga-Muster eine hervorragende Ergänzung sein. Die Komplexität steigt jedoch mit der Anzahl der Microservices und der Anzahl der Schritte. 

Tests und Debugging können bei Verwendung dieses Designs schwierig werden, da Sie alle Services ausführen 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 reservieren, Autoverleih zu reservieren 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 („ReserveFlightBezahlung der Reservierung eines ReserveCarRentalAutos („Bezahler“ („ProcessPaymentBeantwortung der Flugreservierungen“ „ConfirmFlightBezahlt und Bestätigung der AutoverleiheConfirmCarRental“) gefolgt von einer Erfolgsbenachrichtigung, wenn diese Schritte abgeschlossen sind. Wenn das System jedoch auf Fehler beim Ausführen einer dieser Transaktionen stößt, schlägt es abwärts. Beispielsweise löst ein Fehler bei der Zahlungsabwicklung („ProcessPayment“) eine Erstattung („RefundPayment“) aus, der dann eine Stornierung des Autos und des Fluges („CancelRentalReservation“ und „CancelFlightReservation“) auslöst, wodurch die gesamte Transaktion mit einer Fehlermeldung beendet wird.

Dieses Muster stellt separate Lambda-Funktionen für jede Aufgabe bereit, die im Diagramm hervorgehoben ist, sowie drei DynamoDB-Tabellen für Flüge, Autoverleih und Zahlungen. 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 Amazon SNS, um Textnachrichten (SMS) an Abonnenten zu senden und sie über fehlgeschlagene oder erfolgreiche Transaktionen zu benachrichtigen. 

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

AWS-Services

  • AWS Step Functions ist ein Serverless-Orchestrierungsservice, mit dem Sie AWS Lambda-Funktionen und andere AWS-Services kombinieren können, um geschäftskritische Anwendungen zu erstellen. Über die grafische Step-Functions-Konsole sehen Sie den Workflow Ihrer Anwendung als eine Reihe von ereignisgesteuerten Schritten.

  • Amazon DynamoDB ist ein vollständig verwalteter NoSQL-Datenbankservice, der eine 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.

  • AWS Lambda ist ein Datenverarbeitungsservice, mit dem Sie Code ausführen können, ohne Server bereitstellen oder verwalten zu müssen. 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 zum Erstellen, Veröffentlichen, Warten, Überwachen und Sichern von REST-, HTTP- und - WebSocket APIs in jeder Größenordnung.

  • Amazon Simple Notification Service (Amazon SNS )ist ein verwalteter Service, der die Nachrichtenzustellung von Publishern an Abonnenten bereitstellt.

  • AWS Cloud Development Kit (AWS CDK) ist ein Softwareentwicklungs-Framework zur Definition Ihrer Cloud-Anwendungsressourcen mithilfe vertrauter Programmiersprachen wie TypeScript, JavaScript, Python, Java und C#/.Netz.

  • AWS Serverless Application Model (AWS SAM) ist ein Open-Source-Framework für die Erstellung von Serverless-Anwendungen. Es bietet eine Kurznotation, um Funktionen, APIs, Datenbanken und Ereignisquellenzuordnungen auszudrücken.

Code

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

Polen

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 Abschnitt Code weiter oben in diesem Muster.

Führen Sie im Stammordner mit der -package.jsonDatei den folgenden Befehl aus, um alle Node Package Manager (NPM)-Pakete herunterzuladen und zu installieren:

npm install
Entwickler, Cloud-Architekt

Kompilieren Sie Skripts.

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 er eine Änderung erkennt:

npm run watch
Entwickler, Cloud-Architekt

Führen Sie Einheitentests durch (nur AWS-CDK).

Wenn Sie das AWS-CDK verwenden, führen Sie im Stammordner den folgenden Befehl aus, um die Tests der Jest-Einheit durchzuführen:

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

Stellen Sie den Demo-Stack in AWS bereit.

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

Führen Sie im Stammordner den folgenden Befehl aus, um eine Bereitstellungsgruppe zu erstellen und sie im Standard-AWS-Konto und in der Standardregion bereitzustellen.

AWS-CDK:

cdk bootstrap cdk deploy

AWS SAM:

sam build sam deploy --guided

Terraform:

terraform init terraform apply

Dieser Schritt kann einige Minuten dauern. Dieser Befehl verwendet die Standardanmeldeinformationen, die für die AWS CLI konfiguriert wurden.

Notieren Sie sich die API Gateway-URL, die nach Abschluss der Bereitstellung in 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 Saga-Ausführungsablauf.

Navigieren Sie zu der API Gateway-URL, die Sie im vorherigen Schritt notiert haben, als Sie den Stack bereitgestellt haben. Diese URL löst den Start des Zustandsautomaten aus. Weitere Informationen zum Bearbeiten des Flows des Zustandsautomaten durch Übergabe verschiedener URL-Parameter finden Sie im Abschnitt Zusätzliche Informationen.

Um die Ergebnisse anzuzeigen, melden Sie sich bei der AWS-Managementkonsole an und navigieren Sie zur Step Functions-Konsole. Hier können Sie jeden Schritt des Saga-Zustandsautomaten sehen. Sie können auch die DynamoDB-Tabelle anzeigen, um die eingefügten, aktualisierten oder gelöschten Datensätze anzuzeigen. Wenn Sie den Bildschirm häufig aktualisieren, können Sie die Änderung des Transaktionsstatus von pending zu beobachtenconfirmed

Sie können das SNS-Thema abonnieren, indem Sie den Code in der stateMachine.ts Datei mit Ihrer Mobiltelefonnummer aktualisieren, um SMS-Nachrichten bei erfolgreichen oder fehlgeschlagenen Reservierungen zu empfangen. Weitere Informationen finden Sie unter Amazon SNS im Abschnitt Zusätzliche Informationen.

Entwickler, Cloud-Architekt
AufgabeBeschreibungErforderliche Fähigkeiten

Bereinigen Sie Ressourcen.

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 Papiere

AWS-Servicedokumentation

Tutorials

Zusätzliche Informationen

Code

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

Die saga Lambda-Funktion (sagaLambda.ts) nimmt Eingaben von den Abfrageparametern in der API Gateway-URL entgegen, 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 Flows des Step-Functions-Zustandsautomaten experimentieren, indem Sie die folgenden URL-Parameter übergeben:

  • Erfolgreiche Ausführung https://{api-Gateway-URL}

  • Reservieren von Telefonie https://{api gateway url}?runType =failFlightsReservation

  • Bestätigen Sie den HTTPS://{api-Gateway url}?runType =failFlightsConfirmation

  • Reservieren Sie ein Auto, das fehlschlägt https://{api gateway url}?runType = failCarRentalReservierung

  • Bestätigen Sie den Ausfall des Autos https://{api Gateway url}?runType =failCarRentalConfirmation

  • Zahlungsfehler verarbeiten https://{api gateway url}?runType =failPayment

  • Übergeben einer Journey ID Bol https://{api gateway url}?tripID ={standardmäßig ist die Fahrt-ID die AWS-Anforderungs-ID}

IaC-Vorlagen

Die verknüpften Repositorys enthalten IaC-Vorlagen, mit denen Sie die gesamte Beispielanwendung für die Reisereservierung erstellen können.

DynamoDB-Tabellen

Im Folgenden finden Sie die Datenmodelle für die Flug-, Autoverleih- und Zahlungstabellen.

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 Ablauf und die Ausführung des Zustandsautomaten in Step Functions zu unterstützen:

  • Reserve Bols : Fügt einen Datensatz mit einem transaction_status von in die DynamoDB-Tabelle einpending, um einen Flug zu reservieren.

  • Bestätigen des Flugs: Aktualisiert den Datensatz in der DynamoDB-Tabelle, um ihn transaction_status auf festzulegenconfirmed, um den Flug zu bestätigen.

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

  • Reservieren eines Autos: Fügt einen Datensatz in die DynamoDB CarRentals -Tabelle mit einem transaction_status von einpending, um eine Autoverleih zu reservieren.

  • bestätigte Autohärenzen : Aktualisiert den Datensatz in der DynamoDB CarRentals -Tabelle, um transaction_status auf festzulegenconfirmed, um die Autoverleih zu bestätigen.

  • Reservierung für stornierte Autos: Löscht den Datensatz aus der DynamoDB CarRentals -Tabelle, um die ausstehende Autoverleihung zu stornieren.

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

  • Zahlung abbrechen: Löscht den Datensatz aus der DynamoDB-Tabelle Zahlungen für die Zahlung.

Amazon SNS

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

AWS-CDK-Ausschnitt (Hinzufügen der Telefonnummer in der zweiten Zeile des folgenden Codes):

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'), });

AWS SAM-Ausschnitt (ersetzen Sie die +1111111111 Zeichenfolgen durch Ihre 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-Ausschnitt (ersetzen Sie die +111111111 Zeichenfolge durch Ihre 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 Flow veranschaulicht eine erfolgreiche Reservierung mit „ReserveFlight“, „ReserveCarRental“ und „ProcessPayment“, gefolgt von „ConfirmFlight“ und „ConfirmCarRental“. Der Kunde wird über die erfolgreiche Reservierung per SMS-Nachrichten benachrichtigt, die an den Abonnenten des SNS-Themas gesendet werden.

Fehlgeschlagene Reservierungen

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