在 AWS 設計具備容錯與韌性的應用程式
在 AWS 上開發應用程式
Ricardo Sueiras
Principal Technologist
暫時性失敗
- 認識常見失敗型態:
- 暫時性錯誤會自行消失,通常可安全重試。
逾時
- 認識常見失敗型態:
- 暫時性錯誤會自行消失,通常可安全重試。
- 逾時:外部服務回應過慢。
永久性錯誤
- 認識常見失敗型態:
- 暫時性錯誤會自行消失,通常可安全重試。
- 逾時:外部服務回應過慢。
- 永久性錯誤:請求本質有誤,重試無濟於事。
API 限制
- 認識常見失敗型態:
- 暫時性錯誤會自行消失,通常可安全重試。
- 逾時:外部服務回應過慢。
- 永久性錯誤:請求本質有誤,重試無濟於事。
- API 速率限制:請求過多,會收到 HTTP 429 Too Many Requests。
重試策略
- 分散式系統的失敗多為暫時性。
- 重試常可成功。
- 謹慎加入重試,盲目重試會惡化問題。
- 乘冪退避:逐次拉長重試間隔。
- 抖動:加入隨機性以避免重試尖峰。
- 設定重試上限:避免無限迴圈。
AWS SDK 原生功能
- AWS SDK 會自動處理重試邏輯。
- 內建重試包含乘冪退避與抖動。
- 失敗或節流的請求會以遞增延遲重試。
- 可減少你需要撰寫的錯誤處理程式碼。
管理重試邏輯
- 重試邏輯不一定是解方。
- HTTP 4xx:伺服器理解但拒絕了你的請求。
- 非冪等請求:重試可能造成重複或不一致行為。
管理逾時
- 無上限重試會在高負載下放大問題。
- 將重試與逾時搭配使用。
- 逾時設定你願意等待回應的最長時間。
- 每次外部呼叫都應設定逾時。
斷路器
- 當服務持續失敗時,僅靠重試不夠。
- 持續送出請求會壓垮故障服務。
- 斷路器樣式會暫停對不健康相依的請求。
- 關閉狀態:請求正常通行。
斷路器
- 當失敗超過門檻時,電路會打開。
- 後續請求將被封鎖。
斷路器
- 冷卻後進入半開狀態以測試恢復。
- 成功回應:恢復正常運作。
- 仍在失敗:電路保持開啟。
- 在應用程式層實作斷路器。
死信佇列
- 持續失敗的訊息會阻塞系統。
- 將它們移出主要處理流程。
- 失敗訊息會進到 Dead Letter Queue。
- 是打造韌性應用的重要組件。
- 但要理解權衡。
AWS API 限制
- 你透過 API 與 AWS 服務互動。
- 各服務有各自的 API 速率限制。
- 超出限制會被節流(HTTP 429 Too Many Requests)。
- 設計應用程式能優雅處理節流。
整合第三方服務
- 第三方服務帶來不確定性。
- 你無法控制其效能或可用性。
- 設定逾時以避免久候。
- 對暫時性問題使用帶退避的重試。
- 隔離相依以縮小影響範圍。
與第三方整合
- 考慮從同步改為非同步通訊。
- 即使外部服務延遲,你的系統仍可持續處理。
Preparing Video For Download...