重試與降級:模型服務不穩時怎麼撐住
上游會限流、會逾時、會過載。這是一套可直接用的韌性策略。
模型 API 的可用性通常低於一般的雲端服務,而且失敗常常是尖峰時的集中失敗。沒有韌性設計,你的服務會跟著一起倒。
分辨哪些該重試
- 該重試:429 限流、5xx 過載、網路逾時。
- 不該重試:400 參數錯誤、401 認證失敗、內容過濾。重試只是浪費配額。
指數退避加抖動
import random, time
def with_retry(fn, tries=4, base=0.5, cap=8.0):
for i in range(tries):
try:
return fn()
except (RateLimited, Overloaded, Timeout):
if i == tries - 1: raise
delay = min(cap, base * (2 ** i)) * (0.5 + random.random())
time.sleep(delay) # 抖動避免所有客戶端同時重試抖動(jitter)不能省。沒有它,所有客戶端會在同一時刻一起重試,把剛恢復的服務再打掛一次。
降級策略
- 換模型:主力模型過載時改用備援模型,即使品質略降。
- 換供應商:同一個模型在不同平台上都有,事先接好。
- 降級功能:改回傳規則式結果或快取結果,並明確告知使用者。
- 排隊延後:非即時任務改成排程處理。
熔斷器
連續失敗達到門檻時,直接停止呼叫一段時間並走降級路徑。這能避免把大量請求送進一個已知壞掉的上游,也讓上游有機會恢復。
重試次數與逾時要一起設計。四次重試各等 8 秒,加起來使用者要等半分鐘——這時候應該快速失敗,而不是堅持重試。