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.
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
Aufgabe | Beschreibung | Erforderliche 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
| 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:
| 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:
| 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:
| Entwickler, Cloud-Architekt |
Aufgabe | Beschreibung | Erforderliche 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:
AWS SAM:
Terraform:
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:
AWS SAM:
Terraform:
| Entwickler, Cloud-Architekt |
Aufgabe | Beschreibung | Erforderliche 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 Sie können das SNS Thema abonnieren, indem Sie den Code in der | Entwickler, Cloud-Architekt |
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Ressourcen bereinigen. | Um die für diese Anwendung bereitgestellten Ressourcen zu bereinigen, können Sie einen der folgenden Befehle verwenden. AWS CDK:
AWS SAM:
Terraform:
| 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 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 einzustellen
confirmed
,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 setzen
confirmed
,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.
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.