事件驅動系統中的幂等性和可靠性:實用指南

事件驅動架構與冪等性介紹

事件驅動架構的崛起

現代電子商務系統通常依賴於事件驅動架構,以確保可擴展性和響應性。例如,當用戶下訂單時,會觸發像是「訂單已下」、「付款已處理」和「庫存已更新」等事件,這些事件是異步觸發的。

分散系統中冪等性的重要性

在分散系統中,由於網絡故障,事件可能會被重複或重試,導致重複訂單或庫存調整不正確等問題。冪等性確保多次處理事件的結果與處理一次時相同。

理解冪等性

什麼是冪等性?

冪等性確保一個操作多次執行時產生相同的效果。例如,如果由於網絡故障調用了兩次「下單」API,應該只創建一個訂單。

冪等性與其他容錯機制

冪等性專注於在重試時的正確性,而容錯機制如重試或斷路器處理故障,但可能無法防止重複。

實現冪等性面臨的挑戰

常見的重複事件原因

  • 網絡故障: 像AWS API Gateway這樣的API網關可能會在未及時收到回應時重試請求。
  • 重試和確認延遲: 如果確認延遲,支付網關可能會重新發送“支付確認”事件。
  • 故障的生產者或消費者: 電子商務結帳微服務可能因系統中的錯誤而發出重複的“訂單已創建”事件。

沒有幂等性的潛在風險

  • 數據不一致: 處理重複的“庫存更新”事件可能導致庫存水平不正確。
  • 業務邏輯失敗: 對客戶重複收費可能損害信任並造成退款頭疼。

電子商務流程圖

以下圖示說明了電子商務平台中各組件之間的操作和互動序列。它突顯了客戶從瀏覽產品到完成購買及追蹤訂單的旅程。這個圖通常包括核心流程,如用戶互動、後端系統工作流程、支付處理、庫存更新和交付機制。該流程提供了一個整體的視角,顯示各組件如何互動以提供無縫的購物體驗。此外,在關鍵工作流程中實施冪等性,例如支付處理和庫存更新,確保系統在面對網絡故障或重試時仍然可靠和一致。採用一些AWS服務,如AWS SQS FIFO佇列DynamoDBSNS,可以顯著簡化在事件驅動架構中實施冪等性的過程。

圖中的關鍵流程

1. 用戶瀏覽和搜索

  • 用戶瀏覽產品目錄或搜索特定項目。
  • 後端從產品目錄服務中檢索數據,通常使用AWS ElastiCache進行快取以獲得更快的結果。

2. 願望清單管理

  • 用戶可以將項目添加到他們的願望清單中。
  • 操作是冪等的,以確保相同的產品不會被多次添加。

3. 添加至購物車和結帳

  • 產品被添加到購物車中,確保數量的冪等調整以防止重複。
  • 在結帳時,系統驗證購物車內容並計算總價格。

4. 付款處理

  • 支付網關啟動交易。
  • 冪等性確保即使因網關超時而重試,也只處理一次付款。

5. 訂單下單

  • 在成功付款後,觸發“訂單已下單”事件。
  • 系統創建訂單記錄,而冪等性防止重複訂單的創建。

6. 庫存更新

  • 根據下單情況調整庫存。
  • 冪等更新確保即使有重複或重試事件,庫存水平也保持準確。

7. 訂單履行與交付

  • 訂單狀態經歷“處理中”、“已發貨”和“已交付”等階段。
  • 更新是冪等的,以避免因重複事件導致的錯誤狀態變更。

8. 訂單追踪與通知

  • 用戶可以檢查其訂單狀態。
  • 通知(例如,電子郵件/SMS)是冪等地發送,以避免向用戶發送重複的垃圾郵件。

冪等性要求

1. 購物車更新

將相同產品添加兩次應更新數量,而不是創建重複的購物車條目。

  • 實作: 使用唯一的購物車項目識別碼及條件更新在DynamoDB中。

2. 付款閘道

付款重試不得導致重複收費。

  • 實作: 使用存儲於DynamoDB中的IdempotencyKey來追蹤已完成的交易。

3. 訂單建立

重試所產生的重複「訂單已建立」事件不應該創建多個訂單。

  • 實作: 在AWS DynamoDB中使用唯一的orderID和條件PutItem操作。

4. 庫存更新

調整庫存水平應考慮重試以避免過度減少。

  • 實作: 使用分佈式鎖(例如,使用AWS DynamoDB TTL)來處理並發更新。

5. 通知

由事件觸發的電子郵件或簡訊通知應該僅發送一次。

  • 實作: 使用去重鍵搭配像Amazon Simple Notification Service (SNS)的服務。

結論

在事件驅動系統中,特別是在電子商務平台和像 AWS 這樣的雲架構中,冪等性對於保證可靠性、容錯性和數據一致性至關重要。通過實施穩健的冪等模式並利用像 DynamoDB、SQS 和 SNS 等工具,開發人員可以減輕重試和重複事件所帶來的風險。本指南演示了採用這些做法不僅增強了系統的可靠性,還通過提供無縫且無錯誤的體驗來建立用戶信任。隨著對韌性和可擴展系統需求的增長,掌握冪等性成為現代軟件設計的基石。

Source:
https://dzone.com/articles/idempotency-and-reliability-in-event-driven-systems