|
在函數(shù)調(diào)用的過程中,可能有多種原因?qū)е潞瘮?shù)調(diào)用失敗。不同的錯誤類型以及調(diào)用方式(同步調(diào)用、異步調(diào)用)都會影響重試策略。實際業(yè)務(wù)生產(chǎn)中,有很多開發(fā)者對這里的策略有疑惑,本文將全面解讀 Serverless 異步隊列重試策略,并對多種使用場景提供相關(guān)的配置建議。
錯誤類型
在函數(shù)調(diào)用的過程中,可能有多種原因?qū)е潞瘮?shù)調(diào)用失敗。錯誤類型分為以下幾類:
調(diào)用錯誤
調(diào)用錯誤發(fā)生在函數(shù)實際執(zhí)行前。以下情形均會產(chǎn)生調(diào)用錯誤:
- 調(diào)用請求錯誤。例如傳入的 Event 數(shù)據(jù)結(jié)構(gòu)過大、入?yún)⒉环弦?、函?shù)不存在等。
- 調(diào)用方錯誤。主要出現(xiàn)在調(diào)用方權(quán)限不足的情形。
- 超限錯誤。調(diào)用的并發(fā)數(shù)超出 最大并發(fā)數(shù) 限制
運行錯誤
運行錯誤發(fā)生在函數(shù)實際運行中。運行錯誤有以下情形:
- 代碼運行錯誤。這類錯誤出現(xiàn)在用戶代碼執(zhí)行過程中,例如函數(shù)代碼拋出異常,或者返回結(jié)果格式問題等。
- Runtime 錯誤。函數(shù)運行過程中,Runtime 負(fù)責(zé)拉起用戶代碼并執(zhí)行。Runtime 錯誤指的是 Runtime 發(fā)現(xiàn)并上報的錯誤,例如函數(shù)運行超時、代碼語法報錯等。
系統(tǒng)錯誤
函數(shù)平臺的錯誤,例如 internal error。
重試策略
不同錯誤類型以及調(diào)用方式(同步調(diào)用、異步調(diào)用)都會影響重試策略。
同步調(diào)用
同步調(diào)用包含 云 API 觸發(fā)器 的同步調(diào)用、API 網(wǎng)關(guān)觸發(fā)器 及 CKafka 觸發(fā)器。
由于同步調(diào)用的過程中,錯誤信息會直接返回給用戶,所以在同步調(diào)用中發(fā)生錯誤時,平臺不會自動重試,重試策略(是否重試、重試幾次)均由調(diào)用方?jīng)Q定。
異步調(diào)用
異步調(diào)用包含 云 API 觸發(fā)器 的異步調(diào)用、COS 觸發(fā)器、定時觸發(fā)器 及 CMQ Topic 觸發(fā)器 等,具體觸發(fā)器調(diào)用類型請參考相關(guān)觸發(fā)器說明文檔。
在新版重試策略中,開發(fā)者可以根據(jù)業(yè)務(wù)訴求在函數(shù)配置中修改和自定義默認(rèn)的【重試次數(shù)】,【最長等待時間】配置,該配置只適用于異步調(diào)用場景。

- 重試次數(shù):函數(shù)返回錯誤時云函數(shù)重試的次數(shù),該參數(shù)只適用于運行錯誤的策略配置,默認(rèn)配置為2次。
- 最長保留時間:云函數(shù)在異步事件隊列中保留事件的最長時間,該參數(shù)適用于所有異步調(diào)用的重試配置,默認(rèn)配置為6小時,最大長度支持10w條。
異步調(diào)用發(fā)生各種錯誤類型的重試策略:
- 運行錯誤(含用戶代碼運行錯誤和 Runtime 錯誤):當(dāng)發(fā)生該類錯誤時,函數(shù)平臺將默認(rèn)重試兩次或使用配置的重試次數(shù),固定間隔1分鐘。在自動重試的同時,新的觸發(fā)事件仍可正常處理。如果您配置了死信隊列,三次失敗后的事件將傳入死信隊列,否則事件將被函數(shù)平臺丟棄。
- 系統(tǒng)錯誤:當(dāng)發(fā)生該類錯誤時,函數(shù)平臺會根據(jù)您配置的最長等待時間持續(xù)重試(默認(rèn)持續(xù)重試6小時),重試間隔按照指數(shù)退避增加到5分鐘。如果您配置了死信隊列,重試超過最長等待時間仍失敗的事件會被發(fā)送到死信隊列,由用戶進(jìn)行進(jìn)一步處理,否則事件將被函數(shù)平臺丟棄。
- 超限錯誤:當(dāng)發(fā)生該類錯誤時,函數(shù)平臺會根據(jù)您配置的最長等待時間持續(xù)重試(默認(rèn)持續(xù)重試6小時),重試間隔為1分鐘。如果您配置了死信隊列,重試超過最長等待時間仍失敗的事件會被發(fā)送到死信隊列,由用戶進(jìn)行進(jìn)一步處理,否則事件將被函數(shù)平臺丟棄。
- 調(diào)用請求錯誤和調(diào)用方錯誤:當(dāng)發(fā)生該類錯誤時,除了超限錯誤,平臺將不會對該類其他錯誤進(jìn)行重試,因為其他請求錯誤即便重試也不會成功。
錯誤重試配置建議
-
一般使用場景:
一般使用場景下,推薦默認(rèn)配置即可滿足大多數(shù)錯誤情況下的重試訴求,無需進(jìn)行任何修改即可放心使用。
-
對代碼重入較敏感:
對代碼重入較敏感的場景,建議將重試次數(shù)調(diào)整為 0 即代碼報錯不會重試。
-
對事件處理實效性較高:
在事件處理實效性要求較高的場景下,并在一定時間范圍內(nèi)進(jìn)行重試的場景下,可配置事件最長保留事件來及時淘汰過期事件。保證錯誤重試的實效性。
-
并發(fā)超限場景:
并發(fā)超限(ResourceLimitReached)指云函數(shù) SCF 在同一時刻執(zhí)行的并發(fā)數(shù)超過并發(fā)配額導(dǎo)致的函數(shù)報錯。并發(fā)超限分為同步調(diào)用、異步調(diào)用兩種情況。
異步調(diào)用并發(fā)超限時其處理邏輯由云函數(shù) SCF 進(jìn)行自動重試,在保留時間內(nèi)并發(fā)超限不會導(dǎo)致如何數(shù)據(jù)丟棄。通常情況下異步調(diào)用的并發(fā)超限用戶無需進(jìn)行任何操作,在設(shè)定的最長等待時間內(nèi),函數(shù)平臺會自動對并發(fā)超限錯誤進(jìn)行重試。異步調(diào)用中,如對實效性比較敏感可以通過配置保留并發(fā)來減少或降低超限對業(yè)務(wù)系統(tǒng)的影響,數(shù)據(jù)較重要可配置死信隊列兜底。
同步調(diào)用的過程中,錯誤信息會直接返回給用戶。
總結(jié)
目前重試可配置已全量開放,通過重試策略配置的能力,可根據(jù)業(yè)務(wù)需求自行配置重試策略。平臺的默認(rèn)重試策略可滿足大多數(shù)開發(fā)者錯誤重試的訴求,更多異步隊列重試配置能力建設(shè)請關(guān)注微信號或官網(wǎng)產(chǎn)品動態(tài)。
One More Thing
立即體驗騰訊云 Serverless Demo,領(lǐng)取 Serverless 新用戶禮包
|