

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 CQRS 和事件來源將整體分解為微服務
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing"></a>

*Rodolfo Jr. Cerrada、Dmitry Gulin 和 Tabby Ward，Amazon Web Services*

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

此模式結合兩種模式，同時使用命令查詢責任分離 (CQRS) 模式和事件來源模式。CQRS 模式會區隔命令和查詢模型的責任。事件來源模式會利用非同步事件驅動的通訊來改善整體使用者體驗。

您可以使用 CQRS 和 Amazon Web Services (AWS) 服務獨立維護和擴展每個資料模型，同時將整體應用程式重構為微服務架構。然後，您可以使用事件來源模式，將資料從命令資料庫同步到查詢資料庫。

此模式使用包含解決方案 (\*.sln) 檔案的範例程式碼，您可以使用最新版本的 Visual Studio 開啟該檔案。此範例包含獎勵 API 程式碼，示範 CQRS 和事件來源如何在 AWS 無伺服器和傳統或內部部署應用程式中運作。

若要進一步了解 CQRS 和事件來源，請參閱[其他資訊](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional)一節。

## 先決條件和限制
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ Amazon CloudWatch
+ Amazon DynamoDB 資料表
+ Amazon DynamoDB Streams
+ AWS Identity and Access Management (IAM) 存取金鑰和私密金鑰；如需詳細資訊，請參閱*相關資源*區段中的影片
+ AWS Lambda
+ 熟悉 Visual Studio
+ 熟悉 AWS Toolkit for Visual Studio；如需詳細資訊，請參閱*相關資源*區段中的 *AWS Toolkit for Visual Studio 示範*影片

**產品版本**
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/)。
+ [AWS Toolkit for Visual Studio 2019](https://aws.amazon.com/visualstudio/)。
+ .NET Core 3.1。此元件是 Visual Studio 安裝中的選項。若要在安裝期間包含 .NET Core，請選取 **NET Core 跨平台開發**。

**限制**
+ 傳統內部部署應用程式 (ASP.NET Core Web API 和資料存取物件） 的範例程式碼不會隨附資料庫。不過，它隨附記憶體`CustomerData`內物件，可做為模擬資料庫。提供的程式碼足以讓您測試模式。

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

**來源技術堆疊**
+ ASP.NET Core Web API 專案
+ IIS Web 伺服器
+ 資料存取物件
+ CRUD 模型

**來源架構**

在來源架構中，CRUD 模型在一個應用程式中包含命令和查詢介面。如需範例程式碼，請參閱 `CustomerDAO.cs`（已連接）。

![應用程式、服務介面、客戶 CRUD 模型和資料庫之間的連線。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1cd3a84c-12c7-4306-99aa-23f2c53d3cd3.png)


**目標技術堆疊**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ AWS Lambda
+ （選用） Amazon API Gateway
+ （選用） Amazon Simple Notification Service (Amazon SNS)

**目標架構**

在目標架構中，命令和查詢界面會分開。下圖中顯示的架構可以使用 API Gateway 和 Amazon SNS 擴充。如需詳細資訊，請參閱[其他資訊](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional)一節。

![與無伺服器 Customer Command 和 Customer Query 微服務連線的應用程式。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1c665697-e3ac-4ef4-98d0-86c2cbf164c1.png)


1. 命令 Lambda 函數會在資料庫上執行寫入操作，例如建立、更新或刪除。

1. 查詢 Lambda 函數會在資料庫上執行讀取操作，例如取得或選取。

1. 此 Lambda 函數會處理來自 命令資料庫的 DynamoDB 串流，並更新查詢資料庫以進行變更。

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

**工具**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) – Amazon DynamoDB 是全受管的 NoSQL 資料庫服務，可提供快速且可預測的效能和無縫的可擴展性。
+ [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) – DynamoDB Streams 會擷取任何 DynamoDB 資料表中項目層級修改的時間順序序列。然後，它會將此資訊存放在日誌中長達 24 小時。靜態加密功能會加密 DynamoDB Streams 中的資料。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda 是一種運算服務，支援執行程式碼，無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼，可自動從每天數項請求擴展成每秒數千項請求。只需為使用的運算時間支付費用，一旦未執行程式碼，就會停止計費。
+ [AWS 管理主控台](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) – AWS 管理主控台是一種 Web 應用程式，包含用於管理 AWS 服務的廣泛服務主控台集合。
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/) – Visual Studio 2019 是整合式開發環境 (IDE)。開放原始碼參與者可免費使用 Community Edition。在此模式中，您將使用 Visual Studio 2019 Community Edition 來開啟、編譯和執行範例程式碼。僅供檢視，您可以使用任何文字編輯器或 [Visual Studio 程式碼](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html)。
+ [AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) – AWS Toolkit for Visual Studio 是 Visual Studio IDE 的外掛程式。AWS Toolkit for Visual Studio 可讓您更輕鬆地開發、偵錯和部署使用 AWS 服務的 .NET 應用程式。

**Code**

已連接範例程式碼。如需部署範例程式碼的指示，請參閱 *Epics* 一節。

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

### 開啟並建置解決方案
<a name="open-and-build-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 開啟解決方案。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員 | 
| 建置解決方案。 | 開啟解決方案的內容 （按一下滑鼠右鍵） 選單，然後選擇**建置解決方案**。這將建置和編譯解決方案中的所有專案。它應該可以成功編譯。<br />Visual Studio Solution Explorer 應會顯示目錄結構。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員 | 

### 建置 DynamoDB 資料表
<a name="build-the-dynamodb-tables"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 提供登入資料。 | 如果您還沒有存取金鑰，請參閱*相關資源*一節中的影片。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員、資料工程師、DBA | 
| 建置專案。 | 若要建置專案，請開啟 **AwS.APG.CQRSES.Build** 專案的內容 （按一下滑鼠右鍵） 選單，然後選擇**建置**。 | 應用程式開發人員、資料工程師、DBA | 
| 建置和填入資料表。 | 若要建置資料表並填入種子資料，請開啟 **AwS.APG.CQRSES.Build** 專案的內容 （按一下滑鼠右鍵） 選單，然後選擇**偵錯**、**啟動新執行個體**。 | 應用程式開發人員、資料工程師、DBA | 
| 驗證資料表建構和資料。 | 若要驗證，請導覽至 **AWS Explorer**，然後展開 **Amazon DynamoDB**。它應該會顯示資料表。開啟每個資料表以顯示範例資料。 | 應用程式開發人員、資料工程師、DBA | 

### 執行本機測試
<a name="run-local-tests"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建置 CQRS 專案。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員、測試工程師 | 
| 建置事件來源專案。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員、測試工程師 | 
| 執行測試。 | 若要執行所有測試，請選擇**檢視**、**測試總**管，然後選擇在**檢視中執行所有測試**。所有測試都應通過，以綠色核取記號圖示表示。  | 應用程式開發人員、測試工程師 | 

### 將 CQRS Lambda 函數發佈至 AWS
<a name="publish-the-cqrs-lambda-functions-to-aws"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 發佈第一個 Lambda 函數。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員、DevOps 工程師 | 
| 驗證函數上傳。 | （選用） 您可以透過導覽至 AWS Explorer 並展開 **AWS Lambda** 來驗證函數是否已成功載入。若要開啟測試視窗，請選擇 Lambda 函數 （按兩下）。 | 應用程式開發人員、DevOps 工程師 | 
| 測試 Lambda 函數。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)所有 CQRS Lambda 專案都位於 `CQRS AWS Serverless\CQRS\Command Microservice`和` CQRS AWS Serverless\CQRS\Command Microservice` 解決方案資料夾下。如需解決方案目錄和專案，請參閱[其他資訊](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional)區段中的**原始程式碼目錄**。 | 應用程式開發人員、DevOps 工程師 | 
| 發佈剩餘的 函數。 | 針對下列專案重複上述步驟：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員、DevOps 工程師 | 

### 將 Lambda 函數設定為事件接聽程式
<a name="set-up-the-lambda-function-as-an-event-listener"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 發佈 Customer and Reward Lambda 事件處理常式。 | 若要發佈每個事件處理常式，請遵循上述史詩中的步驟。<br />專案位於 `CQRS AWS Serverless\Event Source\Customer Event`和 `CQRS AWS Serverless\Event Source\Reward Event` 解決方案資料夾下。如需詳細資訊，請參閱[其他資訊](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional)區段中的*原始程式碼目錄*。 | 應用程式開發人員 | 
| 連接事件來源 Lambda 事件接聽程式。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)接聽程式成功連接到 DynamoDB 資料表後，它將顯示在 Lambda 設計工具頁面上。 | 應用程式開發人員 | 
| 發佈並連接 EventSourceReward Lambda 函數。 | 若要發佈並連接 `EventSourceReward` Lambda 函數，請重複前兩個故事中的步驟，從 **DynamoDB 資料表**下拉式清單中選取 **cqrses-reward-cmd**。 | 應用程式開發人員 | 

### 測試和驗證 DynamoDB 串流和 Lambda 觸發
<a name="test-and-validate-the-dynamodb-streams-and-lambda-trigger"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試串流和 Lambda 觸發。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員 | 
| 驗證，使用 DynamodDB 獎勵查詢表。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員 | 
| 使用 CloudWatch Logs 驗證。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 應用程式開發人員 | 
| 驗證 EventSourceCustomer 觸發程序。 | 若要驗證`EventSourceCustomer`觸發條件，請使用`EventSourceCustomer`觸發條件各自的客戶資料表和 CloudWatch 日誌，重複此史詩中的步驟。 | 應用程式開發人員 | 

## 相關資源
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-resources"></a>

**參考**
+ [Visual Studio 2019 Community Edition 下載](https://visualstudio.microsoft.com/downloads/)
+ [AWS Toolkit for Visual Studio 下載](https://aws.amazon.com/visualstudio/)
+ [AWS Toolkit for Visual Studio 使用者指南](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)
+ [AWS 上的無伺服器](https://aws.amazon.com/serverless/)
+ [DynamoDB 使用案例和設計模式](https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/)
+ [Martin Fowler CQRS](https://martinfowler.com/bliki/CQRS.html)
+ [Martin Fowler 事件來源](https://martinfowler.com/eaaDev/EventSourcing.html)

**影片**
+ [AWS Toolkit for Visual Studio 示範](https://www.youtube.com/watch?v=B190tcu1ERk)
+ [如何為新的 IAM 使用者建立存取金鑰 ID？](https://www.youtube.com/watch?v=665RYobRJDY)

## 其他資訊
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional"></a>

**CQRS 和事件來源**

*CQRS*

CQRS 模式會將單一概念操作模型，例如資料存取物件單一 CRUD （建立、讀取、更新、刪除） 模型，分成命令和查詢操作模型。命令模型是指變更狀態的任何操作，例如建立、更新或刪除。查詢模型是指傳回值的任何操作。

![具有服務介面、CRUD 模型和資料庫的架構。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/3f64756d-681e-4f0e-8034-746263d857b2.png)


1. Customer CRUD 模型包含下列界面：
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`

隨著您的需求變得更加複雜，您可以從此單一模型方法中移動。CQRS 使用命令模型和查詢模型來區隔寫入和讀取資料的責任。如此一來，資料就可以獨立維護和管理。透過明確的責任分離，每個模型的增強功能不會影響另一個模型。此區隔可改善維護和效能，並降低應用程式的複雜性。

![應用程式分成命令和查詢模型，共用單一資料庫。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/12db023c-eb81-4c27-bbb9-b085b13176ae.png)


 

1. Customer Command 模型中的界面：
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`

1. 客戶查詢模型中的界面：
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`
   + `GetMonthlyStatement()`

如需範例程式碼，請參閱*原始程式碼目錄*。

然後，CQRS 模式會解耦資料庫。這種解耦會導致每個服務的整體獨立性，這是微服務架構的主要組成部分。

![命令和查詢模型的個別資料庫。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/016dbfa8-3bd8-42ee-afa1-38a98986c7d5.png)


 在 AWS 雲端中使用 CQRS，您可以進一步最佳化每個服務。例如，您可以設定不同的運算設定，或在無伺服器或容器型微服務之間進行選擇。您可以使用 Amazon ElastiCache 取代內部部署快取。如果您有內部部署發佈/訂閱訊息，您可以將其取代為 Amazon Simple Notification Service (Amazon SNS)。此外，您可以利用pay-as-you-go定價和各種 AWS 服務，這些服務僅針對您使用的項目付費。

CQRS 包含下列優點：
+ 獨立擴展 – 每個模型都可以調整其擴展策略，以滿足服務的需求。與高效能應用程式類似，分開讀取和寫入可讓模型獨立擴展，以滿足每個需求。您也可以新增或減少運算資源，以滿足某個模型的可擴展性需求，而不會影響另一個模型。
+ 獨立維護 – 查詢和命令模型的分離可改善模型的可維護性。您可以對一個模型進行程式碼變更和增強功能，而不會影響另一個模型。
+ 安全 – 將許可和政策套用至個別模型以進行讀取和寫入更為容易。
+ 最佳化讀取 – 您可以定義針對查詢最佳化的結構描述。例如，您可以為彙總資料定義結構描述，並為事實資料表定義單獨的結構描述。
+ 整合 – CQRS 非常適合事件型程式設計模型。
+ 受管複雜性 – 對查詢和命令模型的分離適用於複雜的網域。

使用 CQRS 時，請記住下列注意事項：
+ CQRS 模式僅適用於應用程式的特定部分，而非整個應用程式。如果實作在不符合 模式的網域上，它可以降低生產力、增加風險並引入複雜性。
+ 此模式最適合具有不平衡讀取和寫入操作的常用模型。
+ 對於大量讀取的應用程式，例如需要時間處理的大型報告，CQRS 可讓您選擇正確的資料庫並建立結構描述來存放彙總資料。這可透過僅處理一次報告資料並將其傾印在彙總資料表中，來改善讀取和檢視報告的回應時間。
+ 對於寫入密集型應用程式，您可以設定用於寫入操作的資料庫，並允許命令微服務在寫入需求增加時獨立擴展。如需範例，請參閱 `AWS.APG.CQRSES.CommandRedeemRewardLambda`和 `AWS.APG.CQRSES.CommandAddRewardLambda` 微服務。

*事件來源*

下一個步驟是使用事件來源，在執行命令時同步查詢資料庫。例如，請考慮下列事件：
+ 新增的客戶獎勵點需要更新查詢資料庫中的客戶總獎勵點或彙總獎勵點。
+ 命令資料庫中會更新客戶的姓氏，這需要更新查詢資料庫中的代理客戶資訊。

在傳統 CRUD 模型中，您可以鎖定資料直到完成交易，以確保資料的一致性。在事件來源中，資料會透過發佈一系列事件來同步，訂閱者將使用該事件來更新其個別資料。

事件來源模式可確保並記錄對資料採取的完整一系列動作，並透過一系列事件發佈。這些事件代表一組對資料所做的變更，該事件的訂閱者必須處理這些變更，才能讓記錄保持最新狀態。訂閱者會使用這些事件，同步訂閱者資料庫中的資料。在這種情況下，這是查詢資料庫。

下圖顯示與 AWS 上的 CQRS 搭配使用的事件來源。

![使用 AWS 無伺服器服務的 CQRS 和事件來源模式的微服務架構。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/cc9bc84a-60b4-4459-9a5c-2334c69dbb4e.png)


1. 命令 Lambda 函數會在資料庫上執行寫入操作，例如建立、更新或刪除。

1. 查詢 Lambda 函數會在資料庫上執行讀取操作，例如取得或選取。

1. 此 Lambda 函數會從命令資料庫處理 DynamoDB 串流，並更新查詢資料庫以進行變更。您也可以使用此函數來發佈訊息至 Amazon SNS，以便其訂閱者可以處理資料。

1. （選用） Lambda 事件訂閱者會處理 Amazon SNS 發佈的訊息，並更新查詢資料庫。

1. （選用） Amazon SNS 會傳送寫入操作的電子郵件通知。

在 AWS 上，DynamoDB Streams 可以同步查詢資料庫。DynamoDB 會以近乎即時的方式擷取 DynamobDB 資料表中項目層級修改的時間順序，並在 24 小時內持久儲存資訊。

啟用 DynamoDB Streams 可讓資料庫發佈一系列事件，使事件來源模式成為可能。事件來源模式會新增事件訂閱者。事件訂閱者應用程式會使用事件，並根據訂閱者的責任來處理事件。在上圖中，事件訂閱者會將變更推送至 Query DynamoDB 資料庫，以保持資料同步。使用 Amazon SNS、訊息中介裝置和事件訂閱者應用程式會保持架構解耦。

事件來源包含下列優點：
+ 交易資料的一致性
+ 可靠的稽核線索和動作歷史記錄，可用於監控資料中採取的動作
+ 允許微型服務等分散式應用程式跨環境同步其資料
+ 每當狀態變更時，可靠發佈事件
+ 重建或重播過去狀態
+ 鬆散耦合的實體，交換事件以從單體應用程式遷移到微服務
+ 減少並行更新所造成的衝突；事件來源可避免直接在資料存放區中更新物件的需求
+ 解耦任務和事件的彈性和可擴展性
+ 外部系統更新
+ 在單一事件中管理多個任務

使用事件來源時，請記住下列注意事項：
+ 由於來源訂閱者資料庫之間的資料更新有所延遲，復原變更的唯一方法是將補償事件新增至事件存放區。
+ 實作事件來源具有自其程式設計風格不同的學習曲線。

**測試資料**

成功部署後，請使用下列測試資料來測試 Lambda 函數。

**CommandCreate 客戶**

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

**CommandUpdate 客戶**

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

**CommandDelete 客戶**

輸入客戶 ID 做為請求資料。例如，如果客戶 ID 為 151，請輸入 151 做為請求資料。

```
151
```

**QueryCustomerList**

這是空白的。調用時，它會傳回所有客戶。

**CommandAddReward**

這會新增 40 點給 ID 為 1 的客戶 (Richard)。

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

**CommandRedeemReward**

這會扣除 ID 為 1 (Richard) 的客戶 15 點。

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

**QueryReward**

輸入客戶的 ID。例如，輸入 1 表示 Richard，2 表示 Arnav，3 表示 Shirley。

```
2 
```

**原始程式碼目錄**

使用下表做為 Visual Studio 解決方案目錄結構的指南。 

*CQRS 現場部署程式碼範例解決方案目錄*

![擴展 Command and Query 服務的解決方案目錄。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/4811c2c0-643b-410f-bb87-0b86ec5e194c.png)


**客戶 CRUD 模型**

CQRS 現場部署程式碼範例\\CRUD Model\\AWS.APG.CQRSES.DAL 專案

**Customer CRUD 模型的 CQRS 版本**
+ 客戶命令：`CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command`專案
+ 客戶查詢：`CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query`專案

**命令和查詢微服務**

命令微服務位於解決方案資料夾 下`CQRS On-Premises Code Sample\CQRS Model\Command Microservice`：
+ `AWS.APG.CQRSES.CommandMicroservice` ASP.NET Core API 專案可做為消費者與服務互動的進入點。
+ `AWS.APG.CQRSES.Command` .NET Core 專案是託管命令相關物件和界面的物件。

查詢微服務位於解決方案資料夾 下`CQRS On-Premises Code Sample\CQRS Model\Query Microservice`：
+ `AWS.APG.CQRSES.QueryMicroservice` ASP.NET Core API 專案做為消費者與服務互動的進入點。
+ `AWS.APG.CQRSES.Query` .NET Core 專案是託管查詢相關物件和界面的物件。

*CQRS AWS Serverless 程式碼解決方案目錄*

![顯示微服務和事件來源已展開的解決方案目錄。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/23f8655c-95ad-422c-b20a-e29dc145e995.png)


 

此程式碼是使用 AWS 無伺服器服務的現場部署程式碼的 AWS 版本。

在 C\# .NET Core 中，每個 Lambda 函數都由一個 .NET Core 專案表示。在此模式的範例程式碼中，命令和查詢模型中的每個界面都有單獨的專案。

**使用 AWS 服務的 CQRS**

您可以在 `CQRS AWS Serverless\CQRS`資料夾中找到使用 AWS 無伺服器服務的 CQRS 根解決方案目錄。此範例包含兩種模型：客戶和獎勵。

Customer and Reward 的命令 Lambda 函數位於 `CQRS\Command Microservice\Customer`和 `CQRS\Command Microservice\Reward` 資料夾下。它們包含下列 Lambda 專案：
+ 客戶命令：`CommandDeleteLambda`、 `CommandCreateLambda`和 `CommandUpdateLambda`
+ 獎勵命令： `CommandAddRewardLambda` 和 `CommandRedeemRewardLambda`

客戶和獎勵的查詢 Lambda 函數位於 `CQRS\Query Microservice\Customer`和 `CQRS\QueryMicroservice\Reward`資料夾下。它們包含 `QueryCustomerListLambda`和 `QueryRewardLambda` Lambda 專案。

**CQRS 測試專案**

測試專案位於 `CQRS\Tests` 資料夾下。此專案包含測試指令碼，可自動測試 CQRS Lambda 函數。

**使用 AWS 服務的事件來源**

客戶和獎勵 DynamoDB 串流會啟動下列 Lambda 事件處理常式，以處理和同步查詢資料表中的資料。
+ `EventSourceCustomer` Lambda 函數會映射至客戶資料表 (`cqrses-customer-cmd`) DynamoDB 串流。
+ `EventSourceReward` Lambda 函數會映射至獎勵資料表 (`cqrses-reward-cmd`) DynamoDB 串流。

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

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/9f1bc700-def4-4201-bb2d-f1fa27404f15/attachments/attachment.zip)