

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

# 非同步通訊
<a name="asynchronous"></a>

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

非同步通訊的優點包括：
+ **事件驅動型架構支援** – 自然適用於事件來源和命令查詢責任隔離 (CQRS) 模式。
+ **更好的資源管理** – 服務能夠根據其容量處理請求。
+ **改善故障隔離** – 解耦 服務，防止層疊失敗。
+ **峰值負載處理** – 透過訊息佇列更好地處理流量峰值。

缺點包括複雜性。例如：
+ 如果用戶端需要非同步操作的結果，則實作機制來擷取或接收該結果需要更多精力。
+ 疑難排解非同步操作可能更困難，因為疑難排解需要跨多個系統檢查日誌。
+ 測試非同步操作可能更困難，因為測試需要在多個系統和服務之間進行協調。

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

## Fire 和 忘記
<a name="fire-forget"></a>

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

![非同步通訊中的引發和忘記模式。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-integrating-microservices/images/fire-and-forget.png)


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

其他考量：
+ 實作冪等性來處理重複的訊息。也就是說，每個訊息只應處理一次。
+ 考慮[無效字母佇列](https://aws.amazon.com/what-is/dead-letter-queue/)來處理失敗。
+ 監控訊息處理成功率。

## 宣告檢查
<a name="claim-check"></a>

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

![非同步通訊中的宣告檢查模式。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-integrating-microservices/images/claim-check.png)


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

最佳實務：
+ 實作指數退避輪詢。
+ 為宣告檢查設定適當的存留時間 (TTL)。
+ 提供狀態端點以進行進度追蹤。

## 回電
<a name="callback"></a>

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

![非同步通訊中的回呼模式。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-integrating-microservices/images/callback.png)


實作：
+ 實作失敗回呼的重試機制。
+ 像其他 服務一樣保護回呼位置。
+ 處理回呼逾時。

## 雙向通訊
<a name="bidirectional"></a>

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

![非同步通訊中的雙向通訊模式。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-integrating-microservices/images/bidirectional.png)


實作考量：
+ 訊息排序
  + 序號
  + 分割區策略
  + 訊息排序
+ 狀態管理
  + 事件來源模式
  + 狀態對帳
  + 一致性模式
+ 錯誤處理
  + [無效字母佇列](https://aws.amazon.com/what-is/dead-letter-queue/)
  + 重試政策
  + [斷路器](https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/circuit-breaker.html)
  + 備用策略
+ 監控與可觀測性
  + 關聯 IDs
  + 訊息追蹤
  + 效能指標
  + 系統運作狀態指標