非同步通訊 - AWS 方案指引

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

非同步通訊

相反地,在非同步通訊中,用戶端會向服務發出請求,但不會立即收到回應。在此情況下,用戶端通常只會收到接受請求的確認。

非同步通訊的優點包括:

  • 事件驅動型架構支援 – 自然適用於事件來源和命令查詢責任隔離 (CQRS) 模式。

  • 更好的資源管理 – 服務能夠根據其容量處理請求。

  • 改善故障隔離 – 解耦 服務,防止層疊失敗。

  • 峰值負載處理 – 透過訊息佇列更好地處理流量峰值。

缺點包括複雜性。例如:

  • 如果用戶端需要非同步操作的結果,則實作機制來擷取或接收該結果需要更多精力。

  • 疑難排解非同步操作可能更困難,因為疑難排解需要跨多個系統檢查日誌。

  • 測試非同步操作可能更困難,因為測試需要在多個系統和服務之間進行協調。

非同步通訊的方法包括火災和忘記、宣告檢查、回呼和雙向通訊。

Fire 和 忘記

在觸發和忘記模式中,用戶端會向伺服器發出請求,並同步接收確認,指出伺服器已收到訊息並進行處理。不過,實際處理尚未發生,而且用戶端無法查看何時或如何完成。下圖說明此模式。

非同步通訊中的引發和忘記模式。

在此情況下,在物件持久保留之前,服務不應傳送確認。此持久性可以實作為資料庫寫入操作或將項目放入佇列中。

其他考量:

  • 實作冪等性來處理重複的訊息。也就是說,每個訊息只應處理一次。

  • 考慮無效字母佇列來處理失敗。

  • 監控訊息處理成功率。

宣告檢查

如果用戶端需要服務呼叫的結果,您可以建置服務,在收到請求時發出宣告檢查。下圖說明此模式。宣告檢查會實作為服務在其確認中傳回的識別符。用戶端稍後可以使用此識別符來檢查請求的狀態,並在請求完成時擷取結果。

非同步通訊中的宣告檢查模式。

用戶端必須實作機制來輪詢結果。這可以是自動化 (例如,每 n 分鐘可以執行一次檢查) 或手動實作,其中執行檢查是為了回應另一個事件或使用者動作。實作宣告檢查模式的服務應明確宣告檢查有效的時間長度。

最佳實務:

  • 實作指數退避輪詢。

  • 為宣告檢查設定適當的存留時間 (TTL)。

  • 提供狀態端點以進行進度追蹤。

回電

在回呼模式中,用戶端會向服務發出請求,並提供服務在處理完成時聯絡的位置。用戶端不會等待結果,而處理會繼續。服務負責在處理完成時聯絡 據點並提供結果。回應的常見位置類型為 REST APIs 或佇列。下圖說明回呼模式。

非同步通訊中的回呼模式。

實作:

  • 實作失敗回呼的重試機制。

  • 像其他 服務一樣保護回呼位置。

  • 處理回呼逾時。

雙向通訊

若要實作雙向通訊,您必須在用戶端和服務之間建立具狀態的連線,這可讓用戶端和服務傳送和處理訊息。這會在下列圖表中進行說明。雖然通訊是非同步的,但服務必須能夠支援每個用戶端的開放連線。

非同步通訊中的雙向通訊模式。

實作考量:

  • 訊息排序

    • 序號

    • 分割區策略

    • 訊息排序

  • 狀態管理

    • 事件來源模式

    • 狀態對帳

    • 一致性模式

  • 錯誤處理

  • 監控與可觀測性

    • 關聯 IDs

    • 訊息追蹤

    • 效能指標

    • 系統運作狀態指標