

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.

# Zerlegen Sie Monolithen mithilfe von CQRS und Event Sourcing in Microservices
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing"></a>

*Rodolfo Jr. Cerrada, Dmitry Gulin und Tabby Ward,* Amazon Web Services

## Zusammenfassung
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-summary"></a>

Dieses Muster kombiniert zwei Muster und verwendet sowohl das Command Query Responsibility Separation (CQRS) -Muster als auch das Event Sourcing-Muster. Das CQRS-Muster trennt die Zuständigkeiten der Befehls- und Abfragemodelle. Das Eventsourcing-Muster nutzt die Vorteile der asynchronen ereignisgesteuerten Kommunikation, um die allgemeine Benutzererfahrung zu verbessern.

Sie können CQRS- und Amazon Web Services (AWS) -Services verwenden, um jedes Datenmodell unabhängig zu verwalten und zu skalieren und gleichzeitig Ihre Monolith-Anwendung in eine Microservices-Architektur umzustrukturieren. Anschließend können Sie das Event Sourcing Pattern verwenden, um Daten aus der Befehlsdatenbank mit der Abfragedatenbank zu synchronisieren.

Dieses Muster verwendet Beispielcode, der eine Lösungsdatei (\$1.sln) enthält, die Sie mit der neuesten Version von Visual Studio öffnen können. Das Beispiel enthält Reward-API-Code, der zeigt, wie CQRS und Event Sourcing in serverlosen und traditionellen oder lokalen AWS-Anwendungen funktionieren.

[Weitere Informationen zu CQRS und Event Sourcing finden Sie im Abschnitt Zusätzliche Informationen.](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional)

## Voraussetzungen und Einschränkungen
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-prereqs"></a>

**Voraussetzungen**
+ Ein aktives AWS-Konto
+ Amazon CloudWatch
+ Amazon-DynamoDB-Tabellen
+ Amazon DynamoDB Streams
+ Zugriffsschlüssel und geheimer Schlüssel für AWS Identity and Access Management (IAM); weitere Informationen finden Sie im Video im Abschnitt *Verwandte Ressourcen*
+ AWS Lambda
+ Vertrautheit mit Visual Studio
+ *Vertrautheit mit AWS Toolkit for Visual Studio; weitere Informationen finden Sie im *Demo-Video zu AWS Toolkit for Visual Studio* im Abschnitt Verwandte Ressourcen*

**Produktversionen**
+ [Visual Studio 2019 Community-Ausgabe](https://visualstudio.microsoft.com/downloads/).
+ [AWS Toolkit for Visual Studio 2019](https://aws.amazon.com/visualstudio/).
+ .NET Core 3.1. Diese Komponente ist eine Option in der Visual Studio-Installation. Um .NET Core bei der Installation einzubeziehen, wählen Sie **plattformübergreifende Entwicklung mit NET Core** aus.

**Einschränkungen**
+ Der Beispielcode für eine herkömmliche lokale Anwendung (ASP.NET Core-Web-API und Datenzugriffsobjekte) ist nicht im Lieferumfang einer Datenbank enthalten. Er wird jedoch mit dem `CustomerData` In-Memory-Objekt geliefert, das als Scheindatenbank fungiert. Der bereitgestellte Code reicht aus, um das Muster zu testen.

## Architektur
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-architecture"></a>

**Quelltechnologie-Stack**
+ ASP.NET Core-Web-API-Projekt
+ IIS-Webserver
+ Datenzugriffsobjekt
+ CRUD-Modell

**Quellarchitektur**

In der Quellarchitektur enthält das CRUD-Modell sowohl Befehls- als auch Abfrageschnittstellen in einer Anwendung. Beispielcode finden Sie unter `CustomerDAO.cs` (angehängt).

![\[Verbindungen zwischen Anwendung, Serviceschnittstelle, Kunden-CRUD-Modell und Datenbank.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1cd3a84c-12c7-4306-99aa-23f2c53d3cd3.png)


**Zieltechnologie-Stack**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ AWS Lambda
+ (Fakultativ) Amazon API Gateway
+ (Optional) Amazon Simple Notification Service (Amazon SNS)

**Zielarchitektur**

In der Zielarchitektur sind die Befehls- und Abfrageschnittstellen getrennt. Die im folgenden Diagramm gezeigte Architektur kann mit API Gateway und Amazon SNS erweitert werden. Weitere Informationen finden Sie im Abschnitt [Zusätzliche Informationen](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

![\[Anwendung, die eine Verbindung mit den serverlosen Microservices Customer Command und Customer Query herstellt.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1c665697-e3ac-4ef4-98d0-86c2cbf164c1.png)


1. Befehls-Lambda-Funktionen führen Schreiboperationen wie Erstellen, Aktualisieren oder Löschen in der Datenbank durch.

1. Lambda-Abfragefunktionen führen Lesevorgänge wie Get oder Select in der Datenbank durch.

1. Diese Lambda-Funktion verarbeitet die DynamoDB-Streams aus der Befehlsdatenbank und aktualisiert die Query-Datenbank für die Änderungen.

## Tools
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-tools"></a>

**Tools**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) — Amazon DynamoDB ist ein vollständig verwalteter NoSQL-Datenbankservice, der schnelle und vorhersehbare Leistung mit nahtloser Skalierbarkeit bietet.
+ [Amazon DynamoDB Streams — DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) erfasst eine zeitlich geordnete Abfolge von Änderungen auf Elementebene in jeder DynamoDB-Tabelle. Anschließend werden diese Informationen bis zu 24 Stunden lang in einem Protokoll gespeichert. Die Verschlüsselung ruhender Daten verschlüsselt die Daten in DynamoDB Streams.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — AWS Lambda ist ein Rechenservice, der die Ausführung von Code unterstützt, 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. Sie bezahlen nur für die Datenverarbeitungszeit, die Sie wirklich nutzen und es werden keine Gebühren in Rechnung gestellt, wenn Ihr Code nicht ausgeführt wird.
+ [AWS-Managementkonsole](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) — Die AWS-Managementkonsole ist eine Webanwendung, die eine breite Sammlung von Servicekonsolen für die Verwaltung von AWS-Services umfasst.
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/) — Visual Studio 2019 ist eine integrierte Entwicklungsumgebung (IDE). Die Community Edition ist für Open-Source-Mitwirkende kostenlos. In diesem Muster verwenden Sie Visual Studio 2019 Community Edition, um Beispielcode zu öffnen, zu kompilieren und auszuführen. Nur zur Anzeige können Sie einen beliebigen Texteditor oder [Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html) verwenden.
+ [AWS Toolkit für Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) — Das AWS Toolkit for Visual Studio ist ein Plugin für die Visual Studio-IDE. Das AWS Toolkit for Visual Studio erleichtert Ihnen das Entwickeln, Debuggen und Bereitstellen von.NET-Anwendungen, die AWS-Services verwenden.

**Code**

Der Beispielcode ist angehängt. Anweisungen zur Bereitstellung des Beispielcodes finden Sie im Abschnitt *Epics*.

## Epen
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-epics"></a>

### Öffnen und erstellen Sie die Lösung
<a name="open-and-build-the-solution"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Öffnen Sie die Lösung. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Developer | 
| Erstellen Sie die Lösung. | Öffnen Sie das Kontextmenü (mit der rechten Maustaste) für die Lösung und wählen Sie dann **Lösung erstellen** aus. Dadurch werden alle Projekte in der Lösung erstellt und kompiliert. Es sollte erfolgreich kompiliert werden.Visual Studio Solution Explorer sollte die Verzeichnisstruktur anzeigen.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Developer | 

### Erstellen Sie die DynamoDB-Tabellen
<a name="build-the-dynamodb-tables"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Geben Sie die Anmeldeinformationen an. | Wenn Sie noch keinen Zugriffsschlüssel haben, sehen Sie sich das Video im Abschnitt *Verwandte Ressourcen* an.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Entwickler, Dateningenieur, DBA | 
| Erstellen Sie das Projekt. | **Um das Projekt zu erstellen, öffnen Sie das Kontextmenü (Rechtsklick) für das Projekt **aws.apg.cqrses.Build** und wählen Sie dann Build aus.** | App-Entwickler, Dateningenieur, DBA | 
| Erstellen und füllen Sie die Tabellen. | ****Um die Tabellen zu erstellen und sie mit Ausgangsdaten zu füllen, öffnen Sie das Kontextmenü (mit der rechten Maustaste) für das Projekt **aws.apg.cqrses.Build** und wählen Sie dann Debug, Start New Instance aus.**** | App-Entwickler, Dateningenieur, DBA | 
| Überprüfen Sie die Tabellenkonstruktion und die Daten. | Gehen Sie zur Überprüfung zu **AWS Explorer** und erweitern Sie **Amazon DynamoDB**. Es sollte die Tabellen anzeigen. Öffnen Sie jede Tabelle, um die Beispieldaten anzuzeigen. | App-Entwickler, Dateningenieur, DBA | 

### Führen Sie lokale Tests durch
<a name="run-local-tests"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie das CQRS-Projekt. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Entwickler, Testingenieur | 
| Erstellen Sie das Eventsourcing-Projekt. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Entwickler, Testingenieur | 
| Führen Sie die Tests aus. | Um alle Tests auszuführen, wählen Sie **Ansicht**, **Test Explorer** und dann **Alle Tests in Ansicht ausführen** aus. Alle Tests sollten erfolgreich sein, was durch ein grünes Häkchen gekennzeichnet ist.  | App-Entwickler, Testingenieur | 

### Veröffentlichen Sie die CQRS Lambda-Funktionen in AWS
<a name="publish-the-cqrs-lambda-functions-to-aws"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Veröffentlichen Sie die erste Lambda-Funktion. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Entwickler, DevOps Ingenieur | 
| Überprüfen Sie den Funktions-Upload. | (Optional) Sie können überprüfen, ob die Funktion erfolgreich geladen wurde, indem Sie zu AWS Explorer navigieren und **AWS Lambda** erweitern. Um das Testfenster zu öffnen, wählen Sie die Lambda-Funktion (Doppelklick). | App-Entwickler, Ingenieur DevOps  | 
| Testen Sie die Lambda-Funktion. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Alle CQRS Lambda-Projekte befinden sich in den Ordnern `CQRS AWS Serverless\CQRS\Command Microservice` und ` CQRS AWS Serverless\CQRS\Command Microservice` Solution. Das Lösungsverzeichnis und die Projekte finden Sie unter **Quellcodeverzeichnis** im Abschnitt [Zusätzliche Informationen](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | App-Entwickler, DevOps Ingenieur | 
| Veröffentlichen Sie die verbleibenden Funktionen. | Wiederholen Sie die vorherigen Schritte für die folgenden Projekte:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Entwickler, DevOps Ingenieur | 

### Richten Sie die Lambda-Funktion als Event-Listener ein
<a name="set-up-the-lambda-function-as-an-event-listener"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Veröffentlichen Sie die Lambda-Event-Handler „Customer“ und „Reward“. | Um die einzelnen Event-Handler zu veröffentlichen, folgen Sie den Schritten im vorherigen Abschnitt.Die Projekte befinden sich in den Ordnern `CQRS AWS Serverless\Event Source\Customer Event` und `CQRS AWS Serverless\Event Source\Reward Event` Solution. Weitere Informationen finden Sie unter *Quellcode-Verzeichnis* im Abschnitt [Zusätzliche Informationen](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | App-Developer | 
| Hängen Sie den Lambda-Event-Listener an, der das Ereignis ausgibt. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Nachdem der Listener erfolgreich an die DynamoDB-Tabelle angehängt wurde, wird er auf der Lambda-Designer-Seite angezeigt. | App-Developer | 
| Veröffentlichen Sie die EventSourceReward Lambda-Funktion und hängen Sie sie an. | Um die `EventSourceReward` Lambda-Funktion zu veröffentlichen und anzuhängen, wiederholen Sie die Schritte in den beiden vorherigen Storys und wählen Sie **cqrses-reward-cmd**aus der Dropdownliste der **DynamoDB-Tabelle** aus. | App-Developer | 

### Testen und validieren Sie die DynamoDB-Streams und den Lambda-Trigger
<a name="test-and-validate-the-dynamodb-streams-and-lambda-trigger"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Testen Sie den Stream und den Lambda-Trigger. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Developer | 
| Überprüfen Sie, indem Sie die DynamoDDB-Belohnungsabfragetabelle verwenden. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Developer | 
| Bestätigen Sie mithilfe von Protokollen. CloudWatch  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | App-Developer | 
| Validieren Sie den Trigger EventSourceCustomer . | Um den `EventSourceCustomer` Trigger zu validieren, wiederholen Sie die Schritte in diesem Epic und verwenden Sie dabei die entsprechende Kundentabelle und die CloudWatch Logs des `EventSourceCustomer` Triggers. | App-Developer | 

## Zugehörige Ressourcen
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-resources"></a>

**Referenzen**
+ [Visual Studio 2019 Community Edition wird heruntergeladen](https://visualstudio.microsoft.com/downloads/)
+ [AWS Toolkit for Visual Studio herunterladen](https://aws.amazon.com/visualstudio/)
+ [AWS Toolkit for Visual Studio — Benutzerhandbuch](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)
+ [Serverlos auf AWS](https://aws.amazon.com/serverless/)
+ [DynamoDB-Anwendungsfälle und Entwurfsmuster](https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/)
+ [Martin Fowler CQRS](https://martinfowler.com/bliki/CQRS.html)
+ [Martin Fowler Beschaffung von Veranstaltungen](https://martinfowler.com/eaaDev/EventSourcing.html)

**Videos**
+ [Demo zum AWS Toolkit for Visual Studio](https://www.youtube.com/watch?v=B190tcu1ERk)
+ [Wie erstelle ich eine Zugriffsschlüssel-ID für einen neuen IAM-Benutzer?](https://www.youtube.com/watch?v=665RYobRJDY)

## Zusätzliche Informationen
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional"></a>

**CQRS und Eventsourcing**

*CQRS*

Das CQRS-Muster unterteilt ein einzelnes konzeptionelles Betriebsmodell, z. B. ein einzelnes CRUD-Modell (Create, Read, Update, Delete) für Datenzugriffsobjekte, in Befehls- und Abfrageoperationsmodelle. Das Befehlsmodell bezieht sich auf jede Operation, z. B. Erstellen, Aktualisieren oder Löschen, die den Status ändert. Das Abfragemodell bezieht sich auf jede Operation, die einen Wert zurückgibt.

![\[Architektur mit Serviceschnittstelle, CRUD-Modell und Datenbank.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/3f64756d-681e-4f0e-8034-746263d857b2.png)


1. Das Kunden-CRUD-Modell umfasst die folgenden Schnittstellen:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`

Wenn Ihre Anforderungen immer komplexer werden, können Sie von diesem Einzelmodellansatz abrücken. CQRS verwendet ein Befehlsmodell und ein Abfragemodell, um die Verantwortung für das Schreiben und Lesen von Daten zu trennen. Auf diese Weise können die Daten unabhängig voneinander verwaltet und verwaltet werden. Bei einer klaren Trennung der Zuständigkeiten wirken sich Verbesserungen an den einzelnen Modellen nicht auf das andere aus. Diese Trennung verbessert Wartung und Leistung und reduziert die Komplexität der Anwendung, wenn sie wächst.

![\[Die Anwendung wurde in Befehls- und Abfragemodelle aufgeteilt und nutzt eine einzige Datenbank.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/12db023c-eb81-4c27-bbb9-b085b13176ae.png)


 

1. Schnittstellen im Customer Command-Modell:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`

1. Schnittstellen im Modell Customer Query:
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`
   + `GetMonthlyStatement()`

Beispielcode finden Sie unter *Quellcode-Verzeichnis*.

Das CQRS-Muster entkoppelt dann die Datenbank. Diese Entkopplung führt zur vollständigen Unabhängigkeit der einzelnen Dienste, was der Hauptbestandteil der Microservice-Architektur ist.

![\[Separate Datenbanken für Befehls- und Abfragemodelle.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/016dbfa8-3bd8-42ee-afa1-38a98986c7d5.png)


 Mit CQRS in der AWS-Cloud können Sie jeden Service weiter optimieren. Sie können beispielsweise verschiedene Recheneinstellungen festlegen oder zwischen einem serverlosen oder einem containerbasierten Microservice wählen. Sie können Ihr lokales Caching durch Amazon ersetzen. ElastiCache Wenn Sie ein lokales publish/subscribe Messaging-Programm haben, können Sie es durch Amazon Simple Notification Service (Amazon SNS) ersetzen. Darüber hinaus können Sie die pay-as-you-go Preisgestaltung und das breite Spektrum an AWS-Services nutzen, bei denen Sie nur für das bezahlen, was Sie tatsächlich nutzen.

CQRS bietet die folgenden Vorteile:
+ Unabhängige Skalierung — Für jedes Modell kann die Skalierungsstrategie an die Anforderungen und die Nachfrage des Dienstes angepasst werden. Ähnlich wie bei Hochleistungsanwendungen ermöglicht die Trennung von Lese- und Schreibvorgängen, dass das Modell unabhängig skaliert werden kann, um jeder Anforderung gerecht zu werden. Sie können auch Rechenressourcen hinzufügen oder reduzieren, um den Skalierbarkeitsanforderungen eines Modells gerecht zu werden, ohne dass sich dies auf das andere Modell auswirkt.
+ Unabhängige Wartung — Die Trennung von Abfrage- und Befehlsmodellen verbessert die Wartbarkeit der Modelle. Sie können Codeänderungen und Erweiterungen an einem Modell vornehmen, ohne dass sich dies auf das andere auswirkt.
+ Sicherheit — Es ist einfacher, die Berechtigungen und Richtlinien auf separate Modelle zum Lesen und Schreiben anzuwenden.
+ Optimierte Lesevorgänge — Sie können ein Schema definieren, das für Abfragen optimiert ist. Sie können beispielsweise ein Schema für die aggregierten Daten und ein separates Schema für die Faktentabellen definieren.
+ Integration — CQRS passt gut zu ereignisbasierten Programmiermodellen.
+ Verwaltete Komplexität — Die Trennung in Abfrage- und Befehlsmodelle eignet sich für komplexe Domänen.

Beachten Sie bei der Verwendung von CQRS die folgenden Vorbehalte:
+ Das CQRS-Muster gilt nur für einen bestimmten Teil einer Anwendung und nicht für die gesamte Anwendung. Wenn es in einer Domäne implementiert wird, die dem Muster nicht entspricht, kann es die Produktivität verringern, das Risiko erhöhen und zu Komplexität führen.
+ Das Muster eignet sich am besten für häufig verwendete Modelle mit einem Ungleichgewicht zwischen Lese- und Schreibvorgängen.
+ Für leseintensive Anwendungen, wie z. B. große Berichte, deren Verarbeitung einige Zeit in Anspruch nimmt, bietet Ihnen CQRS die Möglichkeit, die richtige Datenbank auszuwählen und ein Schema zum Speichern Ihrer aggregierten Daten zu erstellen. Dadurch wird die Reaktionszeit beim Lesen und Anzeigen des Berichts verbessert, da die Berichtsdaten nur einmal verarbeitet und in der aggregierten Tabelle abgelegt werden.
+ Für schreibintensive Anwendungen können Sie die Datenbank für Schreibvorgänge konfigurieren und dem Befehls-Microservice ermöglichen, unabhängig zu skalieren, wenn der Schreibbedarf steigt. Beispiele finden Sie unter den `AWS.APG.CQRSES.CommandRedeemRewardLambda` Microservices und. `AWS.APG.CQRSES.CommandAddRewardLambda`

*Ereignis-Sourcing*

Der nächste Schritt besteht darin, die Abfragedatenbank mithilfe von Event Sourcing zu synchronisieren, wenn ein Befehl ausgeführt wird. Betrachten Sie beispielsweise die folgenden Ereignisse:
+ Ein Kundenprämienpunkt wird hinzugefügt, sodass die Gesamtzahl oder die aggregierten Prämienpunkte des Kunden in der Abfragedatenbank aktualisiert werden müssen.
+ Der Nachname eines Kunden wird in der Befehlsdatenbank aktualisiert, weshalb die Ersatzkundeninformationen in der Abfragedatenbank aktualisiert werden müssen.

Im herkömmlichen CRUD-Modell stellen Sie die Konsistenz der Daten sicher, indem Sie die Daten sperren, bis eine Transaktion abgeschlossen ist. Beim Event Sourcing werden die Daten synchronisiert, indem eine Reihe von Ereignissen veröffentlicht wird, die dann von einem Abonnenten genutzt werden, um seine jeweiligen Daten zu aktualisieren.

Das Muster der Ereignisbeschaffung gewährleistet und zeichnet eine vollständige Reihe von Aktionen auf, die an den Daten vorgenommen wurden, und veröffentlicht sie in einer Abfolge von Ereignissen. Diese Ereignisse stellen eine Reihe von Änderungen an den Daten dar, die Abonnenten dieses Ereignisses verarbeiten müssen, um ihre Aufzeichnungen auf dem neuesten Stand zu halten. Diese Ereignisse werden vom Abonnenten verarbeitet, wodurch die Daten in der Datenbank des Abonnenten synchronisiert werden. In diesem Fall ist das die Abfragedatenbank.

Das folgende Diagramm zeigt Event Sourcing, das mit CQRS auf AWS verwendet wird.

![\[Microservice-Architektur für die CQRS- und Eventsourcing-Muster unter Verwendung serverloser AWS-Services.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/cc9bc84a-60b4-4459-9a5c-2334c69dbb4e.png)


1. Befehls-Lambda-Funktionen führen Schreiboperationen wie Erstellen, Aktualisieren oder Löschen in der Datenbank durch.

1. Lambda-Abfragefunktionen führen Lesevorgänge wie Get oder Select in der Datenbank durch.

1. Diese Lambda-Funktion verarbeitet die DynamoDB-Streams aus der Befehlsdatenbank und aktualisiert die Query-Datenbank für die Änderungen. Sie können diese Funktion auch verwenden, um eine Nachricht an Amazon SNS zu veröffentlichen, damit die Abonnenten die Daten verarbeiten können.

1. (Optional) Der Lambda-Event-Abonnent verarbeitet die von Amazon SNS veröffentlichte Nachricht und aktualisiert die Query-Datenbank.

1. (Optional) Amazon SNS sendet eine E-Mail-Benachrichtigung über den Schreibvorgang.

Auf AWS kann die Abfragedatenbank mit DynamoDB Streams synchronisiert werden. DynamoDB erfasst eine zeitlich geordnete Abfolge von Änderungen auf Elementebene in einer DynamoBDB-Tabelle nahezu in Echtzeit und speichert die Informationen dauerhaft innerhalb von 24 Stunden.

Durch die Aktivierung von DynamoDB Streams kann die Datenbank eine Sequenz von Ereignissen veröffentlichen, die das Eventsourcing-Muster ermöglicht. Das Event-Sourcing-Muster fügt den Event-Abonnenten hinzu. Die Anwendung für Event-Abonnenten verarbeitet das Ereignis und verarbeitet es je nach Verantwortung des Abonnenten. Im vorherigen Diagramm überträgt der Ereignisabonnent die Änderungen an die Query DynamoDB-Datenbank, um die Daten synchron zu halten. Durch die Verwendung von Amazon SNS, dem Message Broker und der Event-Abonnentenanwendung bleibt die Architektur entkoppelt.

Event Sourcing bietet die folgenden Vorteile:
+ Konsistenz für Transaktionsdaten
+ Ein zuverlässiger Prüfpfad und eine Historie der Maßnahmen, anhand derer die anhand der Daten ergriffenen Maßnahmen überwacht werden können
+ Ermöglicht verteilten Anwendungen wie Microservices, ihre Daten in der gesamten Umgebung zu synchronisieren
+ Zuverlässige Veröffentlichung von Ereignissen, wann immer sich der Status ändert
+ Rekonstruktion oder Wiederholung vergangener Staaten
+ Lose gekoppelte Entitäten, die Ereignisse austauschen, um von einer monolithischen Anwendung zu Microservices zu migrieren
+ Reduzierung von Konflikten, die durch gleichzeitige Aktualisierungen verursacht werden; durch die Ereignisbeschaffung entfällt die Notwendigkeit, Objekte direkt im Datenspeicher zu aktualisieren
+ Flexibilität und Erweiterbarkeit durch die Entkopplung von Aufgabe und Ereignis
+ Updates für externe Systeme
+ Verwaltung mehrerer Aufgaben in einem einzigen Ereignis

Beachten Sie bei der Verwendung von Event Sourcing die folgenden Vorbehalte:
+ Da es bei der Aktualisierung von Daten zwischen den Quell-Abonnentendatenbanken zu Verzögerungen kommt, besteht die einzige Möglichkeit, eine Änderung rückgängig zu machen, darin, dem Ereignisspeicher ein kompensierendes Ereignis hinzuzufügen.
+ Die Implementierung von Event Sourcing ist aufgrund des unterschiedlichen Programmierstils mit einer gewissen Lernkurve verbunden.

**Daten testen**

Verwenden Sie die folgenden Testdaten, um die Lambda-Funktion nach erfolgreicher Bereitstellung zu testen.

**CommandCreate Kunde**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Done",  "CompanyName":"AnyCompany",  "Address": "USA",  "VIP":true }
```

**CommandUpdate Kunde**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Doe",  "CompanyName":"Example Corp.",  "Address": "Seattle, USA",  "VIP":true }
```

**CommandDelete Kunde**

Geben Sie die Kunden-ID als Anfragedaten ein. Wenn die Kunden-ID beispielsweise 151 ist, geben Sie 151 als Anforderungsdaten ein.

```
151
```

**QueryCustomerList**

Das ist leer. Wenn es aufgerufen wird, werden alle Kunden zurückgegeben.

**CommandAddReward**

Dadurch werden dem Kunden mit der ID 1 (Richard) 40 Punkte gutgeschrieben.

```
{
  "Id":10101,
  "CustomerId":1,
  "Points":40
}
```

**CommandRedeemReward**

Dem Kunden mit der ID 1 (Richard) werden dadurch 15 Punkte abgezogen.

```
{
  "Id":10110,
  "CustomerId":1,
  "Points":15
}
```

**QueryReward**

Geben Sie die ID des Kunden ein. Geben Sie beispielsweise 1 für Richard, 2 für Arnav und 3 für Shirley ein.

```
2 
```

**Quellcode-Verzeichnis**

Verwenden Sie die folgende Tabelle als Leitfaden für die Verzeichnisstruktur der Visual Studio-Lösung. 

*Lösungsverzeichnis mit lokalen CQRS-Codebeispielen*

![\[Lösungsverzeichnis mit erweiterten Befehls- und Abfragediensten.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/4811c2c0-643b-410f-bb87-0b86ec5e194c.png)


**CRUD-Modell für Kunden**

Lokales CQRS-Codebeispiel\$1 CRUD-Modell\$1 AWS.APG.CQRSES.DAL-Projekt

**CQRS-Version des Kunden-CRUD-Modells**
+ Kundenbefehl: Projekt `CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command`
+ Kundenanfrage: `CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query` Projekt

**Microservices für Befehle und Abfragen**

Der Command-Mikroservice befindet sich im Lösungsordner: `CQRS On-Premises Code Sample\CQRS Model\Command Microservice`
+ `AWS.APG.CQRSES.CommandMicroservice`Das ASP.NET Core API-Projekt dient als Einstiegspunkt, über den Verbraucher mit dem Dienst interagieren.
+ `AWS.APG.CQRSES.Command`.NET Core-Projekt ist ein Objekt, das befehlsbezogene Objekte und Schnittstellen hostet.

Der Abfrage-Microservice befindet sich im Lösungsordner: `CQRS On-Premises Code Sample\CQRS Model\Query Microservice`
+ `AWS.APG.CQRSES.QueryMicroservice`Das ASP.NET Core API-Projekt dient als Einstiegspunkt, über den Verbraucher mit dem Dienst interagieren.
+ `AWS.APG.CQRSES.Query`.NET Core-Projekt ist ein Objekt, das abfragebezogene Objekte und Schnittstellen hostet.

*CQRS AWS-Lösungsverzeichnis für serverlosen Code*

![\[Lösungsverzeichnis, das sowohl Microservices als auch die Eventquelle enthält, erweitert.\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/23f8655c-95ad-422c-b20a-e29dc145e995.png)


 

Dieser Code ist die AWS-Version des lokalen Codes, der serverlose AWS-Services verwendet.

In C\$1.NET Core wird jede Lambda-Funktion durch ein .NET Core-Projekt repräsentiert. Im Beispielcode dieses Musters gibt es für jede Schnittstelle im Befehls- und Abfragemodell ein eigenes Projekt.

**CQRS verwendet AWS-Services**

Sie finden das Stammlösungsverzeichnis für CQRS, das AWS-Serverless-Services verwendet, im `CQRS AWS Serverless\CQRS` Ordner. Das Beispiel umfasst zwei Modelle: Customer und Reward.

Die Befehle Lambda-Funktionen für Customer und Reward befinden sich in den `CQRS\Command Microservice\Reward` Ordnern `CQRS\Command Microservice\Customer` und. Sie enthalten die folgenden Lambda-Projekte:
+ Kundenbefehl:`CommandCreateLambda`,`CommandDeleteLambda`, und `CommandUpdateLambda`
+ Belohnungsbefehl: `CommandAddRewardLambda` und `CommandRedeemRewardLambda`

Die Lambda-Abfragefunktionen für Customer und Reward befinden sich in den `CQRS\QueryMicroservice\Reward` Ordnern `CQRS\Query Microservice\Customer` und. Sie enthalten die Projekte `QueryCustomerListLambda` und `QueryRewardLambda` Lambda.

**CQRS-Testprojekt**

Das Testprojekt befindet sich unter dem `CQRS\Tests` Ordner. Dieses Projekt enthält ein Testskript zur Automatisierung des Testens der CQRS-Lambda-Funktionen.

**Beschaffung von Veranstaltungen mithilfe von AWS-Services**

Die folgenden Lambda-Event-Handler werden von den DynamoDB-Streams Customer und Reward initiiert, um die Daten in Abfragetabellen zu verarbeiten und zu synchronisieren.
+ Die `EventSourceCustomer` Lambda-Funktion ist dem DynamoDB-Stream Customer table (`cqrses-customer-cmd`) zugeordnet.
+ Die `EventSourceReward` Lambda-Funktion ist dem DynamoDB-Stream Reward table (`cqrses-reward-cmd`) zugeordnet.

## Anlagen
<a name="attachments-9f1bc700-def4-4201-bb2d-f1fa27404f15"></a>

[Um auf zusätzliche Inhalte zuzugreifen, die mit diesem Dokument verknüpft sind, entpacken Sie die folgende Datei: attachment.zip](samples/p-attach/9f1bc700-def4-4201-bb2d-f1fa27404f15/attachments/attachment.zip)