事件驅動架構與冪等性介紹
事件驅動架構的崛起
現代電子商務系統通常依賴於事件驅動架構,以確保可擴展性和響應性。例如,當用戶下訂單時,會觸發像是「訂單已下」、「付款已處理」和「庫存已更新」等事件,這些事件是異步觸發的。
分散系統中冪等性的重要性
在分散系統中,由於網絡故障,事件可能會被重複或重試,導致重複訂單或庫存調整不正確等問題。冪等性確保多次處理事件的結果與處理一次時相同。
理解冪等性
什麼是冪等性?
冪等性確保一個操作多次執行時產生相同的效果。例如,如果由於網絡故障調用了兩次「下單」API,應該只創建一個訂單。
冪等性與其他容錯機制
冪等性專注於在重試時的正確性,而容錯機制如重試或斷路器處理故障,但可能無法防止重複。
實現冪等性面臨的挑戰
常見的重複事件原因
- 網絡故障: 像AWS API Gateway這樣的API網關可能會在未及時收到回應時重試請求。
- 重試和確認延遲: 如果確認延遲,支付網關可能會重新發送“支付確認”事件。
- 故障的生產者或消費者: 電子商務結帳微服務可能因系統中的錯誤而發出重複的“訂單已創建”事件。
沒有幂等性的潛在風險
- 數據不一致: 處理重複的“庫存更新”事件可能導致庫存水平不正確。
- 業務邏輯失敗: 對客戶重複收費可能損害信任並造成退款頭疼。
電子商務流程圖
以下圖示說明了電子商務平台中各組件之間的操作和互動序列。它突顯了客戶從瀏覽產品到完成購買及追蹤訂單的旅程。這個圖通常包括核心流程,如用戶互動、後端系統工作流程、支付處理、庫存更新和交付機制。該流程提供了一個整體的視角,顯示各組件如何互動以提供無縫的購物體驗。此外,在關鍵工作流程中實施冪等性,例如支付處理和庫存更新,確保系統在面對網絡故障或重試時仍然可靠和一致。採用一些AWS服務,如AWS SQS FIFO佇列、DynamoDB和SNS,可以顯著簡化在事件驅動架構中實施冪等性的過程。
圖中的關鍵流程
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