異步調(diào)用
如果您的函數(shù)中存在耗時較長、資源消耗較大或容易出錯的邏輯,您可以使用異步調(diào)用的方式,讓您的程序響應(yīng)更加迅速,更加可靠地應(yīng)對突發(fā)流量。當(dāng)您對函數(shù)發(fā)起異步調(diào)用時,無需等待函數(shù)響應(yīng),相關(guān)請求會被持久化保存到函數(shù)計算內(nèi)部隊列中,然后被可靠地處理。本文介紹異步調(diào)用的應(yīng)用場景以及常見功能。
應(yīng)用場景
異步調(diào)用適用的場景示例如下:
音視頻處理
用戶使用函數(shù)計算處理音視頻業(yè)務(wù)時,涉及處理編碼、解碼或轉(zhuǎn)碼等耗時較長的任務(wù),異步調(diào)用這些任務(wù)使其在后臺運行,前端無需等待,提升用戶體驗。另外,如果音視頻項目較大,需要將其分割成多個任務(wù)并行處理或者需要將一個視頻轉(zhuǎn)換為多種格式,異步調(diào)用多個函數(shù)可以輕松實現(xiàn)以上并行處理需求,縮短任務(wù)處理時間。
數(shù)據(jù)ETL處理
ETL流程中,從源頭提取數(shù)據(jù)、轉(zhuǎn)換處理和加載到目標(biāo)系統(tǒng)這三個步驟可能涉及多個獨立的操作,例如數(shù)據(jù)庫查詢、文件讀寫或數(shù)據(jù)清洗等,采用異步調(diào)用可以讓這些操作并行執(zhí)行,減少處理時間,提升系統(tǒng)性能。而針對耗時較長的任務(wù),例如處理大規(guī)模數(shù)據(jù)集或復(fù)雜的數(shù)據(jù)轉(zhuǎn)換,異步調(diào)用允許這些任務(wù)在后臺運行,前端無需等待,提升用戶體驗。
開發(fā)Web應(yīng)用
函數(shù)計算可以搭配其他云產(chǎn)品快速構(gòu)建Web應(yīng)用。用戶在表單提交、搜索查詢或加載內(nèi)容較多的情況下,采用異步調(diào)用可以避免頁面因長時間等待后端響應(yīng)而出現(xiàn)的卡頓現(xiàn)象,此時用戶可以繼續(xù)與頁面的其他部分交互,而不會感受到延遲。高并發(fā)場景下,例如大量用戶同時訪問,異步調(diào)用函數(shù)又可以分散請求壓力,防止服務(wù)過載。
延遲調(diào)用
針對某些場景,您提交一次異步調(diào)用后,需要函數(shù)計算對其進行延遲觸發(fā)。您可以通過調(diào)用API(SDK)實現(xiàn)延遲調(diào)用函數(shù)。
在代碼中添加HTTP請求頭x-fc-async-delay
,取值范圍為(0,3600),單位為秒。函數(shù)計算將從您觸發(fā)執(zhí)行開始計算,延遲x-fc-async-delay
設(shè)置的時間后觸發(fā)函數(shù)調(diào)用。
重試策略
異步調(diào)用機制提供錯誤處理和重試機制,如果某個步驟失敗,可以重新調(diào)度該任務(wù)而不影響整個流程。當(dāng)函數(shù)異步調(diào)用執(zhí)行失敗后,函數(shù)計算會自動進行錯誤重試。
重試機制
對于常見錯誤,系統(tǒng)默認的重試策略如下表所示。
錯誤類型 | 服務(wù)器端行為 | 是否計費 | 解決方案 |
函數(shù)計算的錯誤類型為 | 默認重試3次,或根據(jù)異步設(shè)置次數(shù)重試。 | 按照調(diào)用次數(shù)計費。關(guān)于計費的詳細信息,請參見計費概述。 | 請自行排查您的代碼。 |
函數(shù)并發(fā)執(zhí)行超上限。 | 以二進制指數(shù)退避方式重試執(zhí)行5小時。當(dāng)您的函數(shù)執(zhí)行失敗后將在0.5秒后開始重試,后續(xù)重試執(zhí)行的時間間隔將以二進制指數(shù)退避方式計算,即重試時間間隔為1秒、2秒、4秒、8秒等持續(xù)重試5小時。 | 否 | 單個阿里云賬號(主賬號)在單個地域內(nèi)總實例數(shù)默認限制為100,實際數(shù)值以配額中心為準(zhǔn),如果您需要提高該限制,請前往配額中心申請。 |
系統(tǒng)內(nèi)部錯誤。 | 否 | 請加入釘釘用戶群(釘釘群號64970014484)咨詢。 | |
函數(shù)計算資源不足。 | 否 |
配置重試策略
函數(shù)計算支持自定義重試次數(shù)和消息最大存活時長。
登錄函數(shù)計算控制臺,在左側(cè)導(dǎo)航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊目標(biāo)函數(shù)。
在函數(shù)詳情頁面,選擇配置頁簽,然后在左側(cè)導(dǎo)航欄,選擇異步配置,在異步配置區(qū)域,單擊編輯。
在異步配置面板,設(shè)置以下配置項,然后單擊部署。
配置項
解釋說明
任務(wù)模式
是否開啟異步任務(wù)模式,請參見異步任務(wù)。
最大重試次數(shù)
用于配置異步調(diào)用流程中的消息最大重試次數(shù),取值范圍為[0,8]。
函數(shù)計算在默認情況下,對異步觸發(fā)失敗的消息進行3次重試,您可以根據(jù)業(yè)務(wù)需求減少或增加對異步調(diào)用的重試。
消息最大存活時長
用于配置異步調(diào)用流程中的消息最大存活時長,取值范圍[1,604800],默認為86400,單位為秒。
該時長從觸發(fā)異步調(diào)用時開始計算,如果超過配置的消息最大存活時長,該條消息將被丟棄。未被消費的消息將計入云監(jiān)控異步調(diào)用觸發(fā)事件(次)指標(biāo)。關(guān)于指標(biāo)詳情,請參見監(jiān)控指標(biāo)。
結(jié)果回調(diào)
函數(shù)計算接收異步調(diào)用請求后,將請求持久化后會立即返回響應(yīng),無需等待請求執(zhí)行完成。如您需要保留執(zhí)行失敗且超過最大重試次數(shù)被丟棄的請求,或通知下游異步調(diào)用結(jié)果,可以通過配置結(jié)果回調(diào)功能實現(xiàn)。配置異步目標(biāo)服務(wù)后,異步調(diào)用請求執(zhí)行完成,函數(shù)計算根據(jù)執(zhí)行結(jié)果自動回調(diào)對應(yīng)的服務(wù)。
功能原理
結(jié)果回調(diào)流程如下圖所示。
適用場景
保存丟棄的事件供后續(xù)使用
當(dāng)異步請求執(zhí)行失敗,并且按照指定的策略重試后仍然失敗,函數(shù)計算將丟棄該請求。如果您配置了失敗目標(biāo),函數(shù)計算將自動把失敗請求的上下文信息推送到消息隊列 RocketMQ 版等消息服務(wù)中,以便后續(xù)處理。您也可以將目標(biāo)服務(wù)設(shè)置為另一個函數(shù),函數(shù)計算將自動把失敗請求的上下文信息推送到該函數(shù),執(zhí)行您自定義的錯誤處理邏輯。
自動通知下游服務(wù)執(zhí)行結(jié)果
請求執(zhí)行成功后,如果您配置了成功目標(biāo),函數(shù)計算系統(tǒng)會自動將成功請求的上下文信息推送到下游目標(biāo)服務(wù)。例如,您配置了使用函數(shù)計算實現(xiàn)自動解壓上傳到OSS的ZIP文件,解壓完成后想要接收消息通知,可采用為目標(biāo)函數(shù)配置異步調(diào)用結(jié)果回調(diào)目標(biāo)服務(wù)。
支持的異步調(diào)用目標(biāo)服務(wù)
當(dāng)您為函數(shù)配置了異步調(diào)用目標(biāo),并且異步調(diào)用后的結(jié)果符合條件時,函數(shù)計算會將請求上下文和數(shù)據(jù)推送至對應(yīng)服務(wù)。您可以針對不同函數(shù)、別名和版本配置不同的目標(biāo)服務(wù)。目前支持的異步調(diào)用目標(biāo)服務(wù)如下:
輕量消息隊列(原 MNS)
函數(shù)計算
事件總線 EventBridge
消息隊列 RocketMQ 版
僅支持將云消息隊列 RocketMQ 版的4.0系列實例配置為目標(biāo)服務(wù),不支持將5.0系列實例設(shè)置為目標(biāo)服務(wù)。更多信息,請參見4.x和5.x版本差異及兼容性說明。
異步調(diào)用目標(biāo)服務(wù)的配置說明如下:
異步調(diào)用目標(biāo)的事件內(nèi)容
輕量消息隊列(原 MNS)、函數(shù)計算或消息隊列 RocketMQ 版作為函數(shù)異步調(diào)用目標(biāo)時,事件內(nèi)容示例如下。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }
表 1. 參數(shù)說明
參數(shù)
說明
timestamp
調(diào)用時間戳。
requestContext
請求上下文。
requestContext.requestId
異步調(diào)用的請求ID。
requestContext.functionArn
異步執(zhí)行的函數(shù)ARN。
requestContext.condition
調(diào)用錯誤碼。
requestContext.approximateInvokeCount
異步調(diào)用的執(zhí)行次數(shù)。當(dāng)該值大于1時,說明函數(shù)計算對您的函數(shù)進行了重試。
requestPayload
請求函數(shù)的原始負載。
responseContext
返回上下文。
responseContext.statusCode
調(diào)用函數(shù)的返回碼(系統(tǒng))。當(dāng)該返回碼不為200時,說明出現(xiàn)了系統(tǒng)錯誤。
responseContext.functionError
調(diào)用錯誤信息。
responsePayload
執(zhí)行函數(shù)返回的原始負載。
事件總線 EventBridge作為函數(shù)異步調(diào)用目標(biāo)時,事件示例如下。具體信息,請參見事件概述。
{ "datacontenttype": "application/json", "aliyunaccountid": "143xxxx", "data": { "requestContext": { "condition": "", "approximateInvokeCount": 1, "requestId": "0fcb7f0c-xxxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 1660120276975 }, "subject": "acs:fc:{regionid}:{accountid}:functions/xxxx", "source": "acs:fc", "type": "fc:AsyncInvoke:succeeded", "aliyunpublishtime": "2021-01-03T09:44:31.233Asia/Shanghai", "specversion": "1.0", "aliyuneventbusname": "xxxxxxx", "id": "ecc4865xxxxxx", "time": "2021-01-03T01:44:31Z", "aliyunregionid": "cn-shanghai-vpc", "aliyunpublishaddr": "199.99.xxx.xxx" }
負載限制
支持的異步調(diào)用目標(biāo)服務(wù)負載的最大限制如下:
輕量消息隊列(原 MNS):64 KB
函數(shù)計算:128 KB
事件總線 EventBridge:64 KB
消息隊列 RocketMQ 版:4 MB
避免循環(huán)調(diào)用
當(dāng)您在配置異步執(zhí)行目標(biāo)時,請確保不要出現(xiàn)循環(huán)調(diào)用的情況。例如,您為函數(shù)A配置了成功調(diào)用時的異步目標(biāo)為函數(shù)B,為函數(shù)B配置了成功調(diào)用時的異步目標(biāo)為函數(shù)A。當(dāng)您異步觸發(fā)函數(shù)A并且執(zhí)行成功后,則可能出現(xiàn)A到B,再到A的循環(huán)調(diào)用的情況。
配置異步調(diào)用目標(biāo)服務(wù)
登錄函數(shù)計算控制臺,在左側(cè)導(dǎo)航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊目標(biāo)函數(shù)。
在函數(shù)詳情頁面,選擇配置頁簽,在左側(cè)導(dǎo)航欄,選擇異步配置,按需配置參數(shù)信息。
配置成功目標(biāo)
在成功目標(biāo)區(qū)域,單擊編輯。
在成功目標(biāo)面板,成功時調(diào)用其他服務(wù)選擇啟用,然后配置當(dāng)函數(shù)成功執(zhí)行后將需要發(fā)送結(jié)果的目標(biāo)云服務(wù)。參數(shù)信息如下:
參數(shù)
說明
目標(biāo)服務(wù)
函數(shù)計算。當(dāng)目標(biāo)服務(wù)選擇的是函數(shù)計算時,需配置以下參數(shù)信息:
函數(shù)名稱:指定目標(biāo)函數(shù)的名稱。
版本或別名:指定函數(shù)的別名或版本。
輕量消息隊列(原 MNS)。當(dāng)目標(biāo)服務(wù)選擇的是輕量消息隊列(原 MNS)時,需配置以下參數(shù)信息:
目標(biāo)類型:按需選擇目標(biāo)類型,取值為:
隊列:
隊列模型提供高可靠、高并發(fā)的一對一消費模型,即隊列中的每一條消息都只能夠被某一個消費者消費。
主題:
主題模型提供一對多的發(fā)布訂閱模型,支持消息通知。
隊列:選擇輕量消息隊列(原 MNS)的隊列名稱。當(dāng)目標(biāo)類型選擇的是隊列時需設(shè)置此參數(shù)。
主題:選擇輕量消息隊列(原 MNS)的主題名稱。當(dāng)目標(biāo)類型選擇的是主題時需設(shè)置此參數(shù)。
消息隊列 RocketMQ 版,當(dāng)目標(biāo)服務(wù)選擇的是消息隊列 RocketMQ 版時,需配置以下參數(shù)信息:
實例:選擇目標(biāo)實例。
Topic:選擇目標(biāo)Topic。
事件總線 EventBridge。當(dāng)目標(biāo)服務(wù)選擇的是事件總線 EventBridge時,需指定自定義事件總線。
單擊部署。
配置失敗目標(biāo)
在失敗目標(biāo)區(qū)域,單擊編輯。
在失敗目標(biāo)面板,失敗時調(diào)用其他服務(wù)選擇啟用,然后配置當(dāng)函數(shù)執(zhí)行失敗后需要發(fā)送消息的目標(biāo)云服務(wù)。
配置失敗目標(biāo)的參數(shù),請參見上方配置成功目標(biāo)參數(shù)說明。
單擊部署。
回調(diào)失敗的處理
當(dāng)函數(shù)角色無目標(biāo)服務(wù)訪問權(quán)限或目標(biāo)服務(wù)不可用時,回調(diào)目標(biāo)服務(wù)可能會失敗。函數(shù)計算提供了相關(guān)的指標(biāo)及日志,您可以根據(jù)需要進行相應(yīng)處理。常見的錯誤及系統(tǒng)行為如下所示:
錯誤碼 | 錯誤原因 | 系統(tǒng)行為 |
5xx | 限流或內(nèi)容錯誤等。 | 函數(shù)計算系統(tǒng)內(nèi)部按指數(shù)退避自動重試。初始重試間隔為500毫秒,最大重試時長為30分鐘。 |
4xx | 無權(quán)限、請求參數(shù)不正確(如目標(biāo)服務(wù)的資源已被刪除)或請求消息體超過目標(biāo)服務(wù)限額等。 | 返回錯誤并記錄錯誤信息。 |
結(jié)果回調(diào)指標(biāo)
當(dāng)回調(diào)目標(biāo)服務(wù)失敗后,函數(shù)計算會記錄相應(yīng)指標(biāo)并展示到控制臺。您可以登錄函數(shù)計算控制臺,在左側(cè)導(dǎo)航欄選擇 ,然后在函數(shù)名稱列表單擊目標(biāo)函數(shù)名稱,查看函數(shù)維度的指標(biāo)情況。
指標(biāo)名稱 | 描述 |
目標(biāo)觸發(fā)失敗(FunctionDestinationErrors) | 函數(shù)異步調(diào)用配置Destination時,函數(shù)執(zhí)行中觸發(fā)目標(biāo)失敗的請求數(shù)。按1分鐘或1小時粒度統(tǒng)計求和。 |
目標(biāo)觸發(fā)成功(FunctionDestinationSucceed) | 函數(shù)異步調(diào)用配置Destination時,函數(shù)執(zhí)行中觸發(fā)目標(biāo)成功的請求數(shù)。按1分鐘或1小時粒度統(tǒng)計求和。 |
更多監(jiān)控指標(biāo),請參見監(jiān)控指標(biāo)。
常見問題
如何觸發(fā)函數(shù)的異步調(diào)用?
您可以通過以下方式對函數(shù)計算的函數(shù)發(fā)起一次異步調(diào)用。
登錄函數(shù)計算控制臺,找到目標(biāo)函數(shù),然后在測試頁簽,勾選我想通過異步的方式進行調(diào)用。
調(diào)用InvokeFunction - 調(diào)用函數(shù)接口,設(shè)置參數(shù)
x-fc-invocation-type
的值為Async。使用Serverless Devs工具配置異步調(diào)用,設(shè)置參數(shù)
invocation-type
的值為Async,詳情請參見調(diào)用函數(shù)。創(chuàng)建支持異步調(diào)用的觸發(fā)器異步觸發(fā)函數(shù),詳情請參見事件觸發(fā)。
后續(xù)操作
如果您希望獲得函數(shù)異步請求各個階段的狀態(tài),可通過開啟任務(wù)模式來實現(xiàn),具體信息,請參見異步任務(wù)。