在函數調用的過程中,可能有多種原因導致函數調用失敗。不同的錯誤類型以及**調用方式(同步調用、異步調用)**都會影響重試策略。實際業務生產中,有很多開發者對這裏的策略有疑惑,本文將全面解讀 Serverless 異步隊列重試策略,並對多種使用場景提供相關的配置建議。
錯誤類型
在函數調用的過程中,可能有多種原因導致函數調用失敗。錯誤類型分爲以下幾類:
調用錯誤
調用錯誤發生在函數實際執行前。以下情形均會產生調用錯誤:
- 調用請求錯誤。例如傳入的 Event 數據結構過大、入參不符合要求、函數不存在等。
- 調用方錯誤。主要出現在調用方權限不足的情形。
- 超限錯誤。調用的併發數超出 最大併發數 限制
運行錯誤
運行錯誤發生在函數實際運行中。運行錯誤有以下情形:
- 代碼運行錯誤。這類錯誤出現在用戶代碼執行過程中,例如函數代碼拋出異常,或者返回結果格式問題等。
- Runtime 錯誤。函數運行過程中,Runtime 負責拉起用戶代碼並執行。Runtime 錯誤指的是 Runtime 發現並上報的錯誤,例如函數運行超時、代碼語法報錯等。
系統錯誤
函數平臺的錯誤,例如 internal error。
重試策略
不同錯誤類型以及**調用方式(同步調用、異步調用)**都會影響重試策略。
同步調用
同步調用包含 雲 API 觸發器 的同步調用、API 網關觸發器 及 CKafka 觸發器。 由於同步調用的過程中,錯誤信息會直接返回給用戶,所以在同步調用中發生錯誤時,平臺不會自動重試,重試策略(是否重試、重試幾次)均由調用方決定。
異步調用
異步調用包含 雲 API 觸發器 的異步調用、COS 觸發器、定時觸發器 及 CMQ Topic 觸發器 等,具體觸發器調用類型請參考相關觸發器說明文檔。 在新版重試策略中,開發者可以根據業務訴求在函數配置中修改和自定義默認的【重試次數】,【最長等待時間】配置,該配置只適用於異步調用場景。
- 重試次數:函數返回錯誤時雲函數重試的次數,該參數只適用於運行錯誤的策略配置,默認配置爲2次。
- **最長保留時間:**雲函數在異步事件隊列中保留事件的最長時間,該參數適用於所有異步調用的重試配置,默認配置爲6小時,最大長度支持10w條。
異步調用發生各種錯誤類型的重試策略:
- 運行錯誤(含用戶代碼運行錯誤和 Runtime 錯誤):當發生該類錯誤時,函數平臺將默認重試兩次或使用配置的重試次數,固定間隔1分鐘。在自動重試的同時,新的觸發事件仍可正常處理。如果您配置了死信隊列,三次失敗後的事件將傳入死信隊列,否則事件將被函數平臺丟棄。
- 系統錯誤:當發生該類錯誤時,函數平臺會根據您配置的最長等待時間持續重試(默認持續重試6小時),重試間隔按照指數退避增加到5分鐘。如果您配置了死信隊列,重試超過最長等待時間仍失敗的事件會被髮送到死信隊列,由用戶進行進一步處理,否則事件將被函數平臺丟棄。
- 超限錯誤:當發生該類錯誤時,函數平臺會根據您配置的最長等待時間持續重試(默認持續重試6小時),重試間隔爲1分鐘。如果您配置了死信隊列,重試超過最長等待時間仍失敗的事件會被髮送到死信隊列,由用戶進行進一步處理,否則事件將被函數平臺丟棄。
- 調用請求錯誤和調用方錯誤:當發生該類錯誤時,除了超限錯誤,平臺將不會對該類其他錯誤進行重試,因爲其他請求錯誤即便重試也不會成功。
錯誤重試配置建議
-
一般使用場景: 一般使用場景下,推薦默認配置即可滿足大多數錯誤情況下的重試訴求,無需進行任何修改即可放心使用。
-
對代碼重入較敏感: 對代碼重入較敏感的場景,建議將重試次數調整爲 0 即代碼報錯不會重試。
-
對事件處理實效性較高: 在事件處理實效性要求較高的場景下,並在一定時間範圍內進行重試的場景下,可配置事件最長保留事件來及時淘汰過期事件。保證錯誤重試的實效性。
-
併發超限場景: 併發超限(ResourceLimitReached)指雲函數 SCF 在同一時刻執行的併發數超過併發配額導致的函數報錯。併發超限分爲同步調用、異步調用兩種情況。 異步調用併發超限時其處理邏輯由雲函數 SCF 進行自動重試,在保留時間內併發超限不會導致如何數據丟棄。通常情況下異步調用的併發超限用戶無需進行任何操作,在設定的最長等待時間內,函數平臺會自動對併發超限錯誤進行重試。異步調用中,如對實效性比較敏感可以通過配置保留併發來減少或降低超限對業務系統的影響,數據較重要可配置死信隊列兜底。 同步調用的過程中,錯誤信息會直接返回給用戶。
總結
目前重試可配置已全量開放,通過重試策略配置的能力,可根據業務需求自行配置重試策略。平臺的默認重試策略可滿足大多數開發者錯誤重試的訴求,更多異步隊列重試配置能力建設請關注微信號或官網產品動態。
One More Thing
立即體驗騰訊雲 Serverless Demo,領取 Serverless 新用戶禮包 👉 serverless/start
歡迎訪問:Serverless 中文網!