選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

使用 CQRS 和事件來源將整體分解為微服務 - AWS 方案指引

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

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

使用 CQRS 和事件來源將整體分解為微服務

由 Rodolfo Jr. Cerrada (AWS)、Dmitry Gulin (AWS) 和 Tabby Ward (AWS) 建立

Summary

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

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

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

若要進一步了解 CQRS 和事件來源,請參閱其他資訊一節。

先決條件和限制

先決條件

  • 作用中的 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 示範影片

產品版本

限制

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

架構

來源技術堆疊

  • ASP.NET Core Web API 專案

  • IIS Web 伺服器

  • 資料存取物件

  • CRUD 模型

來源架構

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

應用程式、服務介面、客戶 CRUD 模型和資料庫之間的連線。

目標技術堆疊

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • AWS Lambda

  • (選用) Amazon API Gateway

  • (選用) Amazon Simple Notification Service (Amazon SNS)

目標架構

在目標架構中,命令和查詢介面會分開。下圖中顯示的架構可以使用 API Gateway 和 Amazon SNS 進行擴充。如需詳細資訊,請參閱其他資訊一節。

與無伺服器 Customer Command 和 Customer Query microservices 連線的應用程式。
  1. Command Lambda 函數會在資料庫上執行寫入操作,例如建立、更新或刪除。

  2. 查詢 Lambda 函數在資料庫中執行讀取操作,例如取得或選取。

  3. 此 Lambda 函數會從命令資料庫處理 DynamoDB 串流,並更新查詢資料庫以進行變更。

工具

工具

  • Amazon DynamoDB – Amazon DynamoDB 是全受管的 NoSQL 資料庫服務,可提供快速且可預測的效能和無縫的可擴展性。

  • Amazon DynamoDB Streams – DynamoDB Streams 會擷取任何 DynamoDB 資料表中項目層級修改的時間順序。然後,它會將此資訊存放在日誌中長達 24 小時。靜態加密功能會加密 DynamoDB Streams 中的資料。

  • AWS Lambda – AWS Lambda 是一種運算服務,支援執行程式碼,無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼,可自動從每天數項請求擴展成每秒數千項請求。只需為使用的運算時間支付費用,一旦未執行程式碼,就會停止計費。

  • AWS 管理主控台 – AWS 管理主控台是一種 Web 應用程式,包含各種用於管理 AWS 服務的服務主控台。

  • Visual Studio 2019 Community Edition – Visual Studio 2019 是整合式開發環境 (IDE)。Community Edition 免費提供給開放原始碼參與者。在此模式中,您將使用 Visual Studio 2019 Community Edition 來開啟、編譯和執行範例程式碼。您只能檢視,您可以使用任何文字編輯器或 Visual Studio Code

  • AWS Toolkit for Visual Studio – AWS Toolkit for Visual Studio 是 Visual Studio IDE 的外掛程式。AWS Toolkit for Visual Studio 可讓您更輕鬆地開發、偵錯和部署使用 AWS 服務的 .NET 應用程式。

Code

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

史詩

任務描述所需的技能

開啟解決方案。

  1. 附件區段下載範例原始程式碼 (CQRS-ES Code.zip),然後擷取檔案。

  2. 在 Visual Studio IDE 中,選擇檔案開啟專案解決方案,然後導覽至您解壓縮原始程式碼的資料夾。

  3. 選擇 AWS.APG.CQRSES.sln,然後選擇開啟。整個解決方案會載入 Visual Studio。

應用程式開發人員

建置解決方案。

開啟解決方案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置解決方案。這將建置和編譯解決方案中的所有專案。它應該可以成功編譯。

Visual Studio Solution Explorer 應會顯示目錄結構。

  • CQRS On-Premises Code Sample 包含在內部部署中使用 CQRS 的範例。

  • CQRS AWS Serverless 包含使用 AWS Serverless 服務的所有 CQRS 和事件來源範例程式碼。

應用程式開發人員

開啟並建置解決方案

任務描述所需的技能

開啟解決方案。

  1. 附件區段下載範例原始程式碼 (CQRS-ES Code.zip),然後擷取檔案。

  2. 在 Visual Studio IDE 中,選擇檔案開啟專案解決方案,然後導覽至您解壓縮原始程式碼的資料夾。

  3. 選擇 AWS.APG.CQRSES.sln,然後選擇開啟。整個解決方案會載入 Visual Studio。

應用程式開發人員

建置解決方案。

開啟解決方案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置解決方案。這將建置和編譯解決方案中的所有專案。它應該可以成功編譯。

Visual Studio Solution Explorer 應會顯示目錄結構。

  • CQRS On-Premises Code Sample 包含在內部部署中使用 CQRS 的範例。

  • CQRS AWS Serverless 包含使用 AWS Serverless 服務的所有 CQRS 和事件來源範例程式碼。

應用程式開發人員
任務描述所需的技能

提供登入資料。

如果您還沒有存取金鑰,請參閱相關資源一節中的影片。

  1. 在 Solution Explorer 中,展開 CQRS AWS Serverless,然後展開建置解決方案資料夾。

  2. 展開 AwS.APG.CQRSES.Build 專案並檢視 Program.cs 檔案。

  3. 捲動至 的頂端Program.cs,並尋找 Program()

  4. 將 取代YOUR ACCESS KEY為您的帳戶存取金鑰,並將 取代YOUR SECRET KEY為您的帳戶私密金鑰。請注意,在生產環境中,您不會硬式編碼您的金鑰。反之,您可以使用 AWS Secrets Manager 來存放和擷取登入資料。

應用程式開發人員、資料工程師、DBA

建置專案。

若要建置專案,請開啟 AwS.APG.CQRSES.Build 專案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置

應用程式開發人員、資料工程師、DBA

建置和填入資料表。

若要建置資料表並填入種子資料,請開啟 AwS.APG.CQRSES.Build 專案的內容 (按一下滑鼠右鍵) 選單,然後選擇偵錯啟動新執行個體

應用程式開發人員、資料工程師、DBA

驗證資料表建構和資料。

若要驗證,請導覽至 AWS Explorer,然後展開 Amazon DynamoDB。它應該顯示資料表。開啟每個資料表以顯示範例資料。

應用程式開發人員、資料工程師、DBA

建置 DynamoDB 資料表

任務描述所需的技能

提供登入資料。

如果您還沒有存取金鑰,請參閱相關資源一節中的影片。

  1. 在 Solution Explorer 中,展開 CQRS AWS Serverless,然後展開建置解決方案資料夾。

  2. 展開 AwS.APG.CQRSES.Build 專案並檢視 Program.cs 檔案。

  3. 捲動至 的頂端Program.cs,並尋找 Program()

  4. 將 取代YOUR ACCESS KEY為您的帳戶存取金鑰,並將 取代YOUR SECRET KEY為您的帳戶私密金鑰。請注意,在生產環境中,您不會硬式編碼您的金鑰。反之,您可以使用 AWS Secrets Manager 來存放和擷取登入資料。

應用程式開發人員、資料工程師、DBA

建置專案。

若要建置專案,請開啟 AwS.APG.CQRSES.Build 專案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置

應用程式開發人員、資料工程師、DBA

建置和填入資料表。

若要建置資料表並填入種子資料,請開啟 AwS.APG.CQRSES.Build 專案的內容 (按一下滑鼠右鍵) 選單,然後選擇偵錯啟動新執行個體

應用程式開發人員、資料工程師、DBA

驗證資料表建構和資料。

若要驗證,請導覽至 AWS Explorer,然後展開 Amazon DynamoDB。它應該顯示資料表。開啟每個資料表以顯示範例資料。

應用程式開發人員、資料工程師、DBA
任務描述所需的技能

建置 CQRS 專案。

  1. 開啟解決方案,然後導覽至 CQRS AWS Services/CQRS/Tests 解決方案資料夾。

  2. AWS.APG.CQRSES.CQRSLambda.Tests 專案中,開啟 BaseFunctionTest.cs,並將 AccessKeySecretKey 取代為您建立的 IAM 金鑰。

  3. 儲存變更。

  4. 若要編譯和建置測試專案,請開啟專案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置

應用程式開發人員、測試工程師

建置事件來源專案。

  1. 導覽至 CQRS AWS Services/Event Source/Tests 解決方案資料夾。 

  2. AWS.APG.CQRSES.EventSourceLambda.Tests 專案中,開啟 BaseFunctionTest.cs,並將 AccessKeySecretKey 取代為您建立的 IAM 金鑰。 

  3. 儲存變更。

  4. 若要編譯和建置測試專案,請開啟專案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置

應用程式開發人員、測試工程師

執行測試。

若要執行所有測試,請選擇檢視測試瀏覽器,然後選擇在檢視中執行所有測試。所有測試都應通過,以綠色核取記號圖示表示。 

應用程式開發人員、測試工程師

執行本機測試

任務描述所需的技能

建置 CQRS 專案。

  1. 開啟解決方案,然後導覽至 CQRS AWS Services/CQRS/Tests 解決方案資料夾。

  2. AWS.APG.CQRSES.CQRSLambda.Tests 專案中,開啟 BaseFunctionTest.cs,並將 AccessKeySecretKey 取代為您建立的 IAM 金鑰。

  3. 儲存變更。

  4. 若要編譯和建置測試專案,請開啟專案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置

應用程式開發人員、測試工程師

建置事件來源專案。

  1. 導覽至 CQRS AWS Services/Event Source/Tests 解決方案資料夾。 

  2. AWS.APG.CQRSES.EventSourceLambda.Tests 專案中,開啟 BaseFunctionTest.cs,並將 AccessKeySecretKey 取代為您建立的 IAM 金鑰。 

  3. 儲存變更。

  4. 若要編譯和建置測試專案,請開啟專案的內容 (按一下滑鼠右鍵) 選單,然後選擇建置

應用程式開發人員、測試工程師

執行測試。

若要執行所有測試,請選擇檢視測試瀏覽器,然後選擇在檢視中執行所有測試。所有測試都應通過,以綠色核取記號圖示表示。 

應用程式開發人員、測試工程師
任務描述所需的技能

發佈第一個 Lambda 函數。

  1. 在 Solution Explorer 中,開啟 AWS.APG.CQRSES.CommandCreateLambda 專案的內容 (按一下滑鼠右鍵) 選單,然後選擇發佈至 AWS Lambda

  2. 選取您要使用的設定檔,以及您要部署 Lambda 函數的 AWS 區域,以及函數名稱。

  3. 對於其餘欄位,保留預設值,然後選擇下一步

  4. 角色名稱下拉式清單中,選取 AWSLambdaFullAccess

  5. 若要提供您的帳戶金鑰,請選擇新增,然後輸入 AcessKey 做為變數,然後輸入 存取金鑰做為值。然後再次選擇新增,輸入 SecretKey 做為變數,輸入 做為秘密金鑰做為值。

  6. 對於其餘欄位,保留預設值,然後選擇上傳。Lambda 測試函數上傳後,會自動出現在 Visual Studio 中。

  7. 針對下列專案重複步驟 1-6:

    • AWS.APG.CQRSES.CommandDeleteLambda

    • AWS.APG.CQRSES.CommandUpdateLambda

    • AWS.APG.CQRSES.CommandAddRewardLambda

    • AWS.APG.CQRSES.CommandRedeemRewardLambda

    • AWS.APG.CQRSES.QueryCustomerListLambda

    • AWS.APG.CQRSES.QueryRewqardLambda

應用程式開發人員、DevOps 工程師

驗證函數上傳。

(選用) 您可以導覽至 AWS Explorer 並展開 AWS Lambda,以驗證函數是否已成功載入。若要開啟測試視窗,請選擇 Lambda 函數 (按兩下)。

應用程式開發人員、DevOps 工程師

測試 Lambda 函數。

  1. 其他資訊區段中輸入請求資料,或從測試資料複製範例請求資料。請確定您為要測試的函數選取 資料。

  2. 若要執行測試,請選擇叫用。回應和任何錯誤會顯示在回應文字方塊中,而日誌會顯示在日誌文字方塊或 CloudWatch Logs 中。

  3. 若要驗證資料,請在 AWS Explorer 中選擇 DynamoDB 資料表 (按兩下)。

所有 CQRS Lambda 專案都位於 CQRS AWS Serverless\CQRS\Command Microservice CQRS AWS Serverless\CQRS\Command Microservice 解決方案資料夾下。如需解決方案目錄和專案,請參閱其他資訊區段中的原始程式碼目錄

應用程式開發人員、DevOps 工程師

發佈其餘 函數。

針對下列專案重複上述步驟:

  • AWS.APG.CQRSES.CommandDeleteLambda

  • AWS.APG.CQRSES.CommandUpdateLambda

  • AWS.APG.CQRSES.CommandAddRewardLambda

  • AWS.APG.CQRSES.CommandRedeemRewardLambda

  • AWS.APG.CQRSES.QueryCustomerListLambda

  • AWS.APG.CQRSES.QueryRewqardLambda

應用程式開發人員、DevOps 工程師

將 CQRS Lambda 函數發佈至 AWS

任務描述所需的技能

發佈第一個 Lambda 函數。

  1. 在 Solution Explorer 中,開啟 AWS.APG.CQRSES.CommandCreateLambda 專案的內容 (按一下滑鼠右鍵) 選單,然後選擇發佈至 AWS Lambda

  2. 選取您要使用的設定檔,以及您要部署 Lambda 函數的 AWS 區域,以及函數名稱。

  3. 對於其餘欄位,保留預設值,然後選擇下一步

  4. 角色名稱下拉式清單中,選取 AWSLambdaFullAccess

  5. 若要提供您的帳戶金鑰,請選擇新增,然後輸入 AcessKey 做為變數,然後輸入 存取金鑰做為值。然後再次選擇新增,輸入 SecretKey 做為變數,輸入 做為秘密金鑰做為值。

  6. 對於其餘欄位,保留預設值,然後選擇上傳。Lambda 測試函數上傳後,會自動出現在 Visual Studio 中。

  7. 針對下列專案重複步驟 1-6:

    • AWS.APG.CQRSES.CommandDeleteLambda

    • AWS.APG.CQRSES.CommandUpdateLambda

    • AWS.APG.CQRSES.CommandAddRewardLambda

    • AWS.APG.CQRSES.CommandRedeemRewardLambda

    • AWS.APG.CQRSES.QueryCustomerListLambda

    • AWS.APG.CQRSES.QueryRewqardLambda

應用程式開發人員、DevOps 工程師

驗證函數上傳。

(選用) 您可以導覽至 AWS Explorer 並展開 AWS Lambda,以驗證函數是否已成功載入。若要開啟測試視窗,請選擇 Lambda 函數 (按兩下)。

應用程式開發人員、DevOps 工程師

測試 Lambda 函數。

  1. 其他資訊區段中輸入請求資料,或從測試資料複製範例請求資料。請確定您為要測試的函數選取 資料。

  2. 若要執行測試,請選擇叫用。回應和任何錯誤會顯示在回應文字方塊中,而日誌會顯示在日誌文字方塊或 CloudWatch Logs 中。

  3. 若要驗證資料,請在 AWS Explorer 中選擇 DynamoDB 資料表 (按兩下)。

所有 CQRS Lambda 專案都位於 CQRS AWS Serverless\CQRS\Command Microservice CQRS AWS Serverless\CQRS\Command Microservice 解決方案資料夾下。如需解決方案目錄和專案,請參閱其他資訊區段中的原始程式碼目錄

應用程式開發人員、DevOps 工程師

發佈其餘 函數。

針對下列專案重複上述步驟:

  • AWS.APG.CQRSES.CommandDeleteLambda

  • AWS.APG.CQRSES.CommandUpdateLambda

  • AWS.APG.CQRSES.CommandAddRewardLambda

  • AWS.APG.CQRSES.CommandRedeemRewardLambda

  • AWS.APG.CQRSES.QueryCustomerListLambda

  • AWS.APG.CQRSES.QueryRewqardLambda

應用程式開發人員、DevOps 工程師
任務描述所需的技能

發佈 Customer and Reward Lambda 事件處理常式。

若要發佈每個事件處理常式,請遵循上述史詩中的步驟。

專案位於 CQRS AWS Serverless\Event Source\Customer EventCQRS AWS Serverless\Event Source\Reward Event 解決方案資料夾下。如需詳細資訊,請參閱其他資訊區段中的原始程式碼目錄

應用程式開發人員

連接事件來源 Lambda 事件接聽程式。

  1. 使用發佈 Lambda 專案時所使用的相同帳戶登入 AWS 管理主控台。

  2. 針對 區域,選取美國東部 1 或您在上一個史詩中部署 Lambda 函數的區域。

  3. 導覽至 Lambda 服務。

  4. 選取 EventSourceCustomerLambda 函數。

  5. 選擇新增觸發程序。

  6. 觸發組態下拉式清單中,選取 DynamoDB

  7. DynamoDB 資料表下拉式清單中,選取 cqrses-customer-cmd

  8. 開始位置下拉式清單中,從 選取修剪地平線。裁剪地平線表示 DynamoDB 觸發程序會在最後一個 (未修剪) 串流記錄開始讀取,這是碎片中最舊的記錄。

  9. 選取啟用觸發程序核取方塊。

  10. 對於其餘欄位,保留預設值,然後選擇新增

接聽程式成功連接到 DynamoDB 資料表後,它會顯示在 Lambda 設計工具頁面上。

應用程式開發人員

發佈並連接 EventSourceReward Lambda 函數。

若要發佈和連接 EventSourceReward Lambda 函數,請重複前兩個故事中的步驟,從 DynamoDB 資料表下拉式清單中選取 cqrses-reward-cmd

應用程式開發人員

將 Lambda 函數設定為事件接聽程式

任務描述所需的技能

發佈 Customer and Reward Lambda 事件處理常式。

若要發佈每個事件處理常式,請遵循上述史詩中的步驟。

專案位於 CQRS AWS Serverless\Event Source\Customer EventCQRS AWS Serverless\Event Source\Reward Event 解決方案資料夾下。如需詳細資訊,請參閱其他資訊區段中的原始程式碼目錄

應用程式開發人員

連接事件來源 Lambda 事件接聽程式。

  1. 使用發佈 Lambda 專案時所使用的相同帳戶登入 AWS 管理主控台。

  2. 針對 區域,選取美國東部 1 或您在上一個史詩中部署 Lambda 函數的區域。

  3. 導覽至 Lambda 服務。

  4. 選取 EventSourceCustomerLambda 函數。

  5. 選擇新增觸發程序。

  6. 觸發組態下拉式清單中,選取 DynamoDB

  7. DynamoDB 資料表下拉式清單中,選取 cqrses-customer-cmd

  8. 開始位置下拉式清單中,從 選取修剪地平線。裁剪地平線表示 DynamoDB 觸發程序會在最後一個 (未修剪) 串流記錄開始讀取,這是碎片中最舊的記錄。

  9. 選取啟用觸發程序核取方塊。

  10. 對於其餘欄位,保留預設值,然後選擇新增

接聽程式成功連接到 DynamoDB 資料表後,它會顯示在 Lambda 設計工具頁面上。

應用程式開發人員

發佈並連接 EventSourceReward Lambda 函數。

若要發佈和連接 EventSourceReward Lambda 函數,請重複前兩個故事中的步驟,從 DynamoDB 資料表下拉式清單中選取 cqrses-reward-cmd

應用程式開發人員
任務描述所需的技能

測試串流和 Lambda 觸發。

  1. 在 Visual Studio 中,導覽至 AWS Explorer。

  2. 展開 AWS Lambda,然後選擇 CommandRedeemRewardfunction (按兩下)。在開啟的函數視窗中,您可以測試函數。

  3. 請求文字方塊中,以 JavaScript 物件標記 (JSON) 格式輸入請求資料。如需範例請求,請參閱其他資訊區段中的測試資料

  4. 選擇調用

應用程式開發人員

驗證,使用 DynamodDB 獎勵查詢表。

  1. 開啟 cqrses-reward-query 資料表。

  2. 檢查兌換獎勵的客戶點數。兌換的點數應該從客戶的總彙總點數中減去。

應用程式開發人員

使用 CloudWatch Logs 驗證。

  1. 導覽至 CloudWatch,然後選擇日誌群組

  2. /aws/lambda/EventSourceRewardlog 群組包含EventSourceReward觸發的日誌。會記錄所有 Lambda 呼叫,包括您在 Lambda 程式碼中context.Logger.LogLineConsole.Writeline 中放置的訊息。

應用程式開發人員

驗證 EventSourceCustomer 觸發程序。

若要驗證EventSourceCustomer觸發條件,請使用EventSourceCustomer觸發條件各自的客戶資料表和 CloudWatch 日誌重複此史詩中的步驟。

應用程式開發人員

測試和驗證 DynamoDB 串流和 Lambda 觸發

任務描述所需的技能

測試串流和 Lambda 觸發。

  1. 在 Visual Studio 中,導覽至 AWS Explorer。

  2. 展開 AWS Lambda,然後選擇 CommandRedeemRewardfunction (按兩下)。在開啟的函數視窗中,您可以測試函數。

  3. 請求文字方塊中,以 JavaScript 物件標記 (JSON) 格式輸入請求資料。如需範例請求,請參閱其他資訊區段中的測試資料

  4. 選擇調用

應用程式開發人員

驗證,使用 DynamodDB 獎勵查詢表。

  1. 開啟 cqrses-reward-query 資料表。

  2. 檢查兌換獎勵的客戶點數。兌換的點數應該從客戶的總彙總點數中減去。

應用程式開發人員

使用 CloudWatch Logs 驗證。

  1. 導覽至 CloudWatch,然後選擇日誌群組

  2. /aws/lambda/EventSourceRewardlog 群組包含EventSourceReward觸發的日誌。會記錄所有 Lambda 呼叫,包括您在 Lambda 程式碼中context.Logger.LogLineConsole.Writeline 中放置的訊息。

應用程式開發人員

驗證 EventSourceCustomer 觸發程序。

若要驗證EventSourceCustomer觸發條件,請使用EventSourceCustomer觸發條件各自的客戶資料表和 CloudWatch 日誌重複此史詩中的步驟。

應用程式開發人員

相關資源

參考

影片

其他資訊

CQRS 和事件來源

CQRS

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

具有服務介面、CRUD 模型和資料庫的架構。
  1. Customer CRUD 模型包含下列界面:

    • Create Customer()

    • UpdateCustomer()

    • DeleteCustomer()

    • AddPoints()

    • RedeemPoints()

    • GetVIPCustomers()

    • GetCustomerList()

    • GetCustomerPoints()

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

應用程式分成命令和查詢模型,共用單一資料庫。
  1. Customer Command 模型中的介面:

    • Create Customer()

    • UpdateCustomer()

    • DeleteCustomer()

    • AddPoints()

    • RedeemPoints()

  2. 客戶查詢模型中的界面:

    • GetVIPCustomers()

    • GetCustomerList()

    • GetCustomerPoints()

    • GetMonthlyStatement()

如需範例程式碼,請參閱原始程式碼目錄

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

命令和查詢模型的個別資料庫。

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

CQRS 包含下列優點:

  • 獨立擴展 – 每個模型都可以調整其擴展策略,以滿足服務的需求和需求。與高效能應用程式類似,分開讀取和寫入可讓模型獨立擴展,以因應每個需求。您也可以新增或減少運算資源,以解決某個模型的可擴展性需求,而不會影響另一個模型。

  • 獨立維護 – 查詢和命令模型的分離可改善模型的可維護性。您可以對一個模型進行程式碼變更和增強功能,而不會影響另一個模型。

  • 安全 – 將許可和政策套用至個別模型以進行讀取和寫入更容易。

  • 最佳化讀取 – 您可以定義針對查詢最佳化的結構描述。例如,您可以為彙總資料定義結構描述,並為事實資料表定義單獨的結構描述。

  • 整合 – CQRS 非常適合事件型程式設計模型。

  • 受管複雜性 – 對查詢和命令模型的分離適用於複雜的網域。

使用 CQRS 時,請記住下列注意事項:

  • CQRS 模式僅適用於應用程式的特定部分,而非整個應用程式。如果實作在不符合 模式的網域上,則可能會降低生產力、增加風險並引入複雜性。

  • 此模式最適合具有不平衡讀取和寫入操作的常用模型。

  • 對於大量讀取的應用程式,例如需要時間處理的大型報告,CQRS 可讓您選擇正確的資料庫並建立結構描述來存放彙總資料。這可改善讀取和檢視報告的回應時間,方法是僅處理一次報告資料,並將其傾印在彙總的資料表中。

  • 對於寫入密集型應用程式,您可以設定用於寫入操作的資料庫,並允許命令微服務在寫入需求增加時獨立擴展。如需範例,請參閱 AWS.APG.CQRSES.CommandRedeemRewardLambdaAWS.APG.CQRSES.CommandAddRewardLambda 微服務。

事件來源

下一個步驟是在執行命令時,使用事件來源來同步查詢資料庫。例如,請考慮下列事件:

  • 新增客戶獎勵點,要求更新查詢資料庫中的客戶總獎勵點或彙總獎勵點。

  • 命令資料庫中會更新客戶的姓氏,這需要更新查詢資料庫中的代理客戶資訊。

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

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

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

使用 AWS 無伺服器服務的 CQRS 和事件來源模式的微服務架構。
  1. Command Lambda 函數會在資料庫上執行寫入操作,例如建立、更新或刪除。

  2. 查詢 Lambda 函數在資料庫中執行讀取操作,例如取得或選取。

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

  4. (選用) Lambda 事件訂閱者會處理 Amazon SNS 發佈的訊息,並更新查詢資料庫。

  5. (選用) 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

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

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

CommandRedeemReward

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

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

QueryReward

輸入客戶的 ID。例如,在 Richard 輸入 1,在 Arnav 輸入 2,在 Shirley 輸入 3。

2

原始程式碼目錄

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

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

擴展 Command and Query 服務的解決方案目錄。

客戶 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專案

命令和查詢微服務

Command microservice 位於解決方案資料夾 下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 程式碼解決方案目錄

顯示微服務和事件來源展開的解決方案目錄。

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

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

使用 AWS 服務的 CQRS

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

客戶和獎勵的命令 Lambda 函數位於 CQRS\Command Microservice\CustomerCQRS\Command Microservice\Reward 資料夾下。其中包含下列 Lambda 專案:

  • 客戶命令:CommandDeleteLambdaCommandCreateLambdaCommandUpdateLambda

  • 獎勵命令: CommandAddRewardLambdaCommandRedeemRewardLambda

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

CQRS 測試專案

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

使用 AWS 服務的事件來源

下列 Lambda 事件處理常式是由 Customer and Reward DynamoDB 串流啟動,以處理和同步查詢資料表中的資料。

  • EventSourceCustomer Lambda 函數會映射到客戶資料表 (cqrses-customer-cmd) DynamoDB 串流。

  • EventSourceReward Lambda 函數會映射到獎勵資料表 (cqrses-reward-cmd) DynamoDB 串流。

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。