在 AWS 設計具備容錯與韌性的應用程式

在 AWS 上開發應用程式

Ricardo Sueiras

Principal Technologist

打造韌性

為韌性而建

在 AWS 上開發應用程式

一切終將失效

在 AWS 上開發應用程式

暫時性失敗

 

暫時性失敗

  • 認識常見失敗型態:
  • 暫時性錯誤會自行消失,通常可安全重試。
在 AWS 上開發應用程式

逾時

 

逾時

  • 認識常見失敗型態:
  • 暫時性錯誤會自行消失,通常可安全重試。
  • 逾時:外部服務回應過慢。
在 AWS 上開發應用程式

永久性錯誤

 

永久性錯誤

  • 認識常見失敗型態:
  • 暫時性錯誤會自行消失,通常可安全重試。
  • 逾時:外部服務回應過慢。
  • 永久性錯誤:請求本質有誤,重試無濟於事。
在 AWS 上開發應用程式

API 限制

 

API 限速

  • 認識常見失敗型態:
  • 暫時性錯誤會自行消失,通常可安全重試。
  • 逾時:外部服務回應過慢。
  • 永久性錯誤:請求本質有誤,重試無濟於事。
  • API 速率限制:請求過多,會收到 HTTP 429 Too Many Requests。
在 AWS 上開發應用程式

重試策略

  • 分散式系統的失敗多為暫時性。
  • 重試常可成功。
  • 謹慎加入重試,盲目重試會惡化問題。
  • 乘冪退避:逐次拉長重試間隔。
  • 抖動:加入隨機性以避免重試尖峰。
  • 設定重試上限:避免無限迴圈。

 

重試策略

在 AWS 上開發應用程式

AWS SDK 原生功能

  • AWS SDK 會自動處理重試邏輯。
  • 內建重試包含乘冪退避與抖動。
  • 失敗或節流的請求會以遞增延遲重試。
  • 可減少你需要撰寫的錯誤處理程式碼。

 

SDK 功能

在 AWS 上開發應用程式

管理重試邏輯

 

不要重試

  • 重試邏輯不一定是解方。
  • HTTP 4xx:伺服器理解但拒絕了你的請求。
  • 非冪等請求:重試可能造成重複或不一致行為。
在 AWS 上開發應用程式

管理逾時

 

管理逾時

  • 無上限重試會在高負載下放大問題。
  • 將重試與逾時搭配使用。
  • 逾時設定你願意等待回應的最長時間。
  • 每次外部呼叫都應設定逾時。
在 AWS 上開發應用程式

斷路器

  • 當服務持續失敗時,僅靠重試不夠。
  • 持續送出請求會壓垮故障服務。
  • 斷路器樣式會暫停對不健康相依的請求。
  • 關閉狀態:請求正常通行。

 

斷路器

在 AWS 上開發應用程式

斷路器

  • 當失敗超過門檻時,電路會打開。
  • 後續請求將被封鎖。

 

斷路器

在 AWS 上開發應用程式

斷路器

  • 冷卻後進入半開狀態以測試恢復。
  • 成功回應:恢復正常運作。
  • 仍在失敗:電路保持開啟。
  • 在應用程式層實作斷路器。

 

斷路器

在 AWS 上開發應用程式

死信佇列

 

死信佇列

  • 持續失敗的訊息會阻塞系統。
  • 將它們移出主要處理流程。
  • 失敗訊息會進到 Dead Letter Queue。
  • 是打造韌性應用的重要組件。
  • 但要理解權衡。
在 AWS 上開發應用程式

AWS API 限制

 

API 限制

  • 你透過 API 與 AWS 服務互動。
  • 各服務有各自的 API 速率限制。
  • 超出限制會被節流(HTTP 429 Too Many Requests)。
  • 設計應用程式能優雅處理節流。
在 AWS 上開發應用程式

整合第三方服務

  • 第三方服務帶來不確定性。
  • 你無法控制其效能或可用性。
  • 設定逾時以避免久候。
  • 對暫時性問題使用帶退避的重試。
  • 隔離相依以縮小影響範圍。

 

第三方整合

在 AWS 上開發應用程式

與第三方整合

  • 考慮從同步改為非同步通訊。
  • 即使外部服務延遲,你的系統仍可持續處理。

 

管理第三方

在 AWS 上開發應用程式

一起來練習吧!

在 AWS 上開發應用程式

Preparing Video For Download...