調用外部服務的錯誤處理怎麼寫:重試、超時、熔斷與降級審查提示詞

代碼裏要調用第三方接口、下游微服務、數據庫或消息隊列時用:讓 AI 檢查超時有沒有設、哪些錯誤能重試、重試會不會造成重複操作、下游掛了怎麼降級,並給出改好的代碼。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
請以「下游隨時可能變慢、報錯或完全不可用」為前提,審查下面這段調用外部依賴的代碼。

背景:
- 語言與使用的客戶端庫:[如 Go + net/http]
- 被調用的依賴:[如短訊服務商接口、訂單服務]
- 這個調用所在的場景:[如用戶下單的同步請求、後台定時任務]
- 調用是否有副作用:[只讀查詢/會扣款或發消息]
- 下游的超時或限流說明:[文檔寫的限制,沒有就寫未知]
- 代碼:
  [粘貼代碼]

檢查清單:
1. 超時:連接超時和讀取超時是否都設定了;整體耗時有沒有上限;同步請求場景下,所有重試加起來會不會超過上游給我們的時間。
2. 錯誤分類:哪些錯誤可以重試(網絡抖動、超時、明確的 503 / 429),哪些絕對不能重試(參數錯誤、鑑權失敗、業務拒絕);代碼是否區分了。
3. 重試策略:次數上限、指數退避加隨機抖動、是否遵守 429 返回的 Retry-After。
4. 冪等:有副作用的調用重試前,是否有冪等鍵或去重手段,避免重複扣款、重複發短訊。
5. 保護措施:下游持續失敗時是否需要熔斷;有沒有降級方案(返回緩存、預設值、排隊稍後處理)以及降級時如何告知用戶。
6. 可觀測性:失敗時日誌是否包含足夠定位的資訊(下游名稱、耗時、狀態碼、請求 ID),且不打印密鑰和個人資料;是否有失敗次數指標。
7. 資源:響應體是否關閉、連接是否複用、並發調用是否有上限。

輸出:
- 問題表:問題 | 風險場景 | 建議;
- 改寫後的完整代碼,用這個語言常用的方式實現(可以使用成熟的庫,說明庫名);
- 一張「錯誤類型 → 處理方式」的對照表,方便團隊以後複用。

高亮處換成你自己的內容:[如 Go + net/http]、[如短訊服務商接口、訂單服務]、[如用戶下單的同步請求、後台定時任務]、[只讀查詢/會扣款或發消息]、[文檔寫的限制,沒有就寫未知]、[粘貼代碼]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[調用是否有副作用] 決定了重試策略的上限——只讀查詢可以放心重試,扣款、發短訊、創建訂單這類調用沒有冪等保護時,一次重試就可能造成真實損失。[這個調用所在的場景] 用來判斷能等多久,用戶同步請求一般只能等幾秒,後台任務可以慢慢重試。

常見坑:

  • 很多 HTTP 客戶端預設沒有超時或超時極長,下游一卡住,線程或連接就被佔滿,最後整個服務不可用。
  • 對所有錯誤統一重試,會把「參數錯誤」重試三遍,或者在下游已經過載時繼續加壓。重試要加退避和抖動。
  • 多層調用每層都重試 3 次,最底層實際會被調用 27 次。重試最好只放在一層。

追問技巧:追問「模擬下游超時、返回 500、返回 429、連接被拒絕四種情況,分別說明這段代碼會怎樣表現」,再讓它寫成測試用例。

示例輸出

示例,僅供參考(錯誤類型對照表節選)
錯誤類型例子處理方式
網絡抖動 / 超時連接重置、讀超時退避重試,最多 2 次;有副作用時必須帶冪等鍵
限流HTTP 429按 Retry-After 等待;超過整體時限則降級
下游故障HTTP 503重試 1 次,連續失敗觸發熔斷 30 秒
請求本身有誤HTTP 400 / 401 / 403不重試,記錄日誌並告警
業務拒絕餘額不足不重試,原樣返回給上游
go
client := &http.Client{Timeout: 3 * time.Second} // 整體超時,含連接與讀取
req.Header.Set("Idempotency-Key", orderID)       // 重試時保持同一個鍵

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~