

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

# 系列事件模式
<a name="saga"></a>

*系列事件*是由一系列本機交易組成。系列事件中的每個本地端交易都會更新資料庫並觸發下一個本地端交易。如果一個交易失敗，系列事件執行補償交易，以恢復由先前的交易所做的資料庫更改。

這一序列的本地端交易有助於透過使用延續和補償原則達成業務工作流程。*延續原則*決定工作流程的向前復原，而*補償原則*決定向後復原。如果更新在交易中的任何步驟失敗，則系列事件會針對繼續 (重試交易) 或補償 (回到先前的資料狀態) 發布事件。這樣可確保資料完整性得以維持，並在整個資料存放區中保持一致。

例如，當使用者向線上零售商購買帳本時，處理包含代表業務工作流程的一系列異動，例如訂單建立、存貨更新、付款及出貨。為了完成此工作流程，分散式架構會發出一系列本機交易，以便在訂單資料庫中建立訂單、更新庫存資料庫，以及更新付款資料庫。當處理成功時，系統會依序呼叫這些交易以完成業務工作流程，如下列圖表所示。但是，如果這些本機交易中的任何一項失敗，系統應該能夠決定適當的下一個步驟 — 也就是向前復原或向後復原。

![saga 模式的業務工作流程。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/cloud-design-patterns/images/saga-1.png)


下列兩種案例有助於判斷下一個步驟是向前復原還是向後復原：
+ 平台層級失敗，其中基礎結構出了問題，並導致交易失敗。在這種情況下，系列事件模式可以透過重試本地交易並繼續業務流程來執行向前恢復。
+ 應用程式層級失敗，即付款服務因為付款無效而失敗。在這種情況下，系列事件模式可以透過發出補償性交易來更新庫存和訂單資料庫，並恢復其先前的狀態來執行向後恢復。

系列事件模式處理業務工作流程，並確保透過向前恢復達到理想的終止狀態。在失敗的情況下，它透過使用向後恢復，以避免資料一致性問題恢復本地端交易。

系列事件模式有兩種變體：編排和協同運作。

## 系列事件編排
<a name="s-choreography"></a>

系列事件編排模式取決於微服務發布的事件。系列事件參與者 (微服務) 訂閱事件並根據事件觸發器採取行動。例如，下列圖表中的訂單服務會發出 `OrderPlaced` 事件。存貨服務會訂閱該事件，並在發出 `OrderPlaced` 事件時更新庫存。同樣地，參與者服務會根據發出事件的內容執行動作。

當系列事件中只有少數參與者，且您需要一個沒有單點故障的簡單實作時，系列事件編排模式非常適合。當加入了更多參與者時，使用此模式來追蹤參與者之間的相依性會變得更加困難。

![系列事件編排模式](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/cloud-design-patterns/images/saga-2.png)


如需詳細評論，請參閱本指南的[系列事件編排](saga-choreography.md)區段。

## 系列事件協同運作
<a name="s-orchestration"></a>

系列事件協同運作模式有個稱為*協調器*的中央協調器。系列事件協調器管理和協調整個交易生命週期。它知道要執行以完成交易的一系列步驟。為了執行一個步驟，它發送一條訊息到參與者微服務來執行操作。參與者微服務完成操作，並將訊息發送回協調器。根據收到的訊息，協調器決定要在交易中接下來執行哪些微服務。

當有許多參與者時，系列事件協同運作模式是合適的，且系列事件參與者之間需要鬆耦合。協調器透過使參與者鬆耦合封裝邏輯中的複雜性。但是，協調器可能會成為單一失敗點，因為它控制了整個工作流程。

![系列事件協同運作模式](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/cloud-design-patterns/images/saga-3.png)


如需詳細評論，請參閱本指南的[系列事件協同運作](saga-orchestration.md)區段。