

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

# 事件來源模式
<a name="service-per-team"></a>

事件來源模式通常與 搭配使用，[CQRS 模式](cqrs-pattern.md)以分離寫入工作負載的讀取，並最佳化效能、可擴展性和安全性。資料會儲存為一系列事件，而不是直接更新資料存放區。Microservices 從事件存放區重播事件，以計算其資料存放區的適當狀態。模式提供應用程式目前狀態的可見性，以及應用程式如何到達該狀態的其他內容。事件來源模式可有效地與 CQRS 模式搭配使用，因為即使命令和查詢資料存放區具有不同的結構描述，也可以針對特定事件重現資料。

透過選擇此模式，您可以識別和重建任何時間點的應用程式狀態。這會產生持久性稽核線索，並使偵錯更容易。不過，資料最終會保持一致，這可能不適用於某些使用案例。

您可以使用 Amazon Kinesis Data Streams 或 Amazon EventBridge 來實作此模式。

## Amazon Kinesis Data Streams 實作
<a name="amazon-kinesis"></a>

在下圖中，Kinesis Data Streams 是集中式事件存放區的主要元件。事件存放區會將應用程式變更擷取為事件，並將其保留在 Amazon Simple Storage Service (Amazon S3) 上。

![\[Amazon Kinesis Data Streams 實作\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-data-persistence/images/enabling-diagram4.png)


工作流程由以下步驟組成：

1. 當「/撤回」或「/額度」微服務發生事件狀態變更時，他們會透過將訊息寫入 Kinesis Data Streams 來發佈事件。

1. 其他微服務，例如「/balance」或「/creditLimit」，讀取訊息的副本，篩選其相關性，然後將其轉送以進行進一步處理。

## Amazon EventBridge 實作
<a name="amazon-eventbridge"></a>

下圖中的架構使用 EventBridge。EventBridge 是一種無伺服器服務，使用事件來連接應用程式元件，讓您更輕鬆地建置可擴展、事件驅動的應用程式。事件驅動型架構是一種透過發出和回應事件來建置鬆耦合軟體系統的方式。EventBridge 為 AWS 服務發佈的事件提供[預設事件匯流排](https://docs.aws.amazon.com//eventbridge/latest/userguide/create-event-bus.html)，您也可以為網域特定的[匯流排建立自訂事件](https://docs.aws.amazon.com//eventbridge/latest/userguide/create-event-bus.html)匯流排。

![\[Amazon EventBridge 實作\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-data-persistence/images/enabling-diagram5.png)


工作流程由以下步驟組成：

1. 「OrderPlaced」事件由「Orders」微服務發佈至自訂事件匯流排。

1. 在下訂單後需要採取動作的微服務，例如「/路由」微服務，是由規則和目標啟動。

1. 這些微服務會產生路由，將訂單運送給客戶並發出「RouteCreated」事件。

1. 需要採取進一步動作的微服務也會由「RouteCreated」事件啟動。

1. 事件會傳送至事件封存 （例如 EventBridge 封存），以便在需要時重新播放以供重新處理。

1. 如有需要，歷史訂單事件會傳送至新的 Amazon SQS 佇列 （重播佇列） 進行重新處理。

1. 如果未啟動目標，受影響的事件會放置在無效字母佇列 (DLQ) 中，以供進一步分析和重新處理。

在以下情況下，您應該考慮使用此模式：
+ 事件用於完全重建應用程式的狀態。
+ 您需要在系統中重播事件，並且可以隨時判斷應用程式的狀態。
+ 您想要能夠反轉特定事件，而不必從空白應用程式狀態開始。
+ 您的系統需要可輕易序列化的事件串流，才能建立自動化日誌。
+ 您的系統需要繁重的讀取操作，但寫入操作很輕；繁重的讀取操作可以導向至記憶體內資料庫，該資料庫會隨著事件串流保持更新。

**重要**  
如果您使用事件來源模式，則必須部署 [Saga 模式](saga-pattern.md)以維持跨微服務的資料一致性。