函數計算接收異步調用請求后,將請求持久化后會立即返回響應,無需等待請求執行完成。如您需要保留執行失敗且超過最大重試次數被丟棄的請求,或通知下游異步調用結果,可以通過配置結果回調功能實現。配置異步目標服務后,異步調用請求執行完成后,函數計算根據執行結果自動回調對應的服務。
功能原理
結果回調流程如下圖所示。
適用場景
保存丟棄的事件供后續使用
當異步請求執行失敗,并且按照指定的策略重試后仍然失敗,函數計算將丟棄該請求。如果您配置了失敗目標,函數計算將自動把失敗請求的上下文信息推送到云消息隊列 RocketMQ 版等消息服務中,以便后續處理。您也可以將目標服務設置為另一個函數,函數計算將自動把失敗請求的上下文信息推送到該函數,執行您自定義的錯誤處理邏輯。
自動通知下游服務執行結果
請求執行成功后,如果您配置了成功目標,函數計算系統會自動將成功請求的上下文信息推送到下游目標服務。例如,您配置了使用函數計算實現自動解壓上傳到OSS的ZIP文件,解壓完成后想要接收消息通知,可采用為目標函數配置異步調用結果回調目標服務。
支持的異步調用目標服務
當您為函數配置了異步調用目標,并且異步調用后的結果符合條件時,函數計算會將請求上下文和數據推送至對應服務。您可以針對不同函數、別名和版本配置不同的目標服務。目前支持的異步調用目標服務如下:
輕量消息隊列(原 MNS)
函數計算
事件總線EventBridge
云消息隊列 RocketMQ 版
僅支持將函數計算的事件函數配置為目標服務,不支持將HTTP函數配置為目標服務。關于事件函數和HTTP函數的更多信息,請參見函數類型選型。
僅支持將云消息隊列 RocketMQ 版的4.0系列實例配置為目標服務,不支持將5.0系列實例設置為目標服務。更多信息,請參見4.x和5.x版本差異及兼容性說明。
異步調用目標服務的配置說明如下:
異步調用目標的事件內容
輕量消息隊列(原 MNS)、函數計算或云消息隊列 RocketMQ 版作為函數異步調用目標時,事件內容示例如下。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:::services/{serviceName}/functions/{functionName}", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }
表 1. 參數說明
參數
說明
timestamp
調用時間戳。
requestContext
請求上下文。
requestContext.requestId
異步調用的請求ID。
requestContext.functionArn
異步執行的函數ARN。
requestContext.condition
調用錯誤碼。
requestContext.approximateInvokeCount
異步調用的執行次數。當該值大于1時,說明函數計算對您的函數進行了重試。
requestPayload
請求函數的原始負載。
responseContext
返回上下文。
responseContext.statusCode
調用函數的返回碼(系統)。當該返回碼不為200時,說明出現了系統錯誤。
responseContext.functionError
調用錯誤信息。
responsePayload
執行函數返回的原始負載。
事件總線EventBridge作為函數異步調用目標時,事件示例如下。具體信息,請參見事件概述。
{ "datacontenttype": "application/json", "aliyunaccountid": "143xxxx", "data": { "requestContext": { "condition": "", "approximateInvokeCount": 1, "requestId": "0fcb7f0c-xxxx", "functionArn": "acs:fc:::services/xxxx.LATEST/functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 1660120276975 }, "subject": "acs:fc:::services/xxxx.LATEST/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" }
負載限制
支持的異步調用目標服務負載的最大限制如下:
輕量消息隊列(原 MNS):64 KB
函數計算:128 KB
事件總線EventBridge:64 KB
云消息隊列 RocketMQ 版:4 MB
避免循環調用
當您在配置異步執行目標時,請務必保證不要出現循環調用的情況。例如,您為函數A配置了成功調用時的異步目標為函數B,為函數B配置了成功調用時的異步目標為函數A。當您異步觸發函數A并且執行成功后,則可能出現A到B,再到A的循環調用的情況。
配置異步調用目標服務
配置異步調用目標前,請先創建函數并確保服務中函數所使用的角色具有對應的云服務權限。具體信息,請參見授予函數計算訪問其他云服務的權限。
輕量消息隊列(原 MNS):mns:SendMessage或mns:PublishMessage。
函數計算:fc:InvokeFunction。
事件總線EventBridge:eventbridge:PutEvents。
云消息隊列 RocketMQ 版:mq:PUB。
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
在函數管理頁面,單擊目標函數名稱,然后在目標函數詳情頁面,單擊異步配置頁簽。
在異步配置頁簽,按需配置參數信息。
配置成功目標
在成功目標區域,單擊編輯。
在編輯成功目標面板,成功時調用其他服務選擇啟用,然后配置當請求執行成功后需要發送結果的目標云服務。參數信息如下:
參數
說明
目標服務
函數計算。當目標服務選擇的是函數計算時,需配置以下參數信息:
服務名稱:指定目標服務的名稱。
版本或別名:指定服務的別名或版本。
函數名稱:指定目標函數的名稱。
說明僅支持將函數計算的事件函數配置為目標服務,不支持將HTTP函數配置為目標服務。
輕量消息隊列(原 MNS)。當目標服務選擇的是輕量消息隊列(原 MNS)時,需配置以下參數信息:
目標類型:按需選擇目標類型,取值為:
隊列:
隊列模型提供高可靠、高并發的一對一消費模型,即隊列中的每一條消息都只能夠被某一個消費者消費。
主題:
主題模型提供一對多的發布訂閱模型,支持消息通知。
隊列:設置輕量消息隊列(原 MNS)的隊列名稱。當目標類型選擇的是隊列時需設置此參數。
主題:選擇輕量消息隊列(原 MNS)的主題名稱。當目標類型選擇的是主題時需設置此參數。
云消息隊列 RocketMQ 版,當目標服務選擇的是云消息隊列 RocketMQ 版時,需配置以下參數信息:
實例:選擇目標實例。
Topic:選擇目標Topic。
事件總線EventBridge。當目標服務選擇的是事件總線EventBridge時,需指定自定義事件總線。
單擊確定。
配置失敗目標
在失敗目標區域,單擊編輯。
在編輯失敗目標面板,失敗時調用其他服務選擇啟用,然后配置當請求執行失敗后需要發送結果的目標云服務。
配置失敗回調目標的參數,請參見配置成功目標。
單擊確定。
觸發函數后,函數執行成功或失敗后,您將從配置的目標服務中讀取以下內容:
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:::services/{serviceName}/functions/{functionName}", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }
回調失敗的處理
當服務角色無目標服務訪問權限或目標服務不可用時,回調目標服務可能會失敗。函數計算提供了相關的指標及日志,您可以根據需要進行相應處理。常見的錯誤及系統行為如下所示:
錯誤碼 | 錯誤原因 | 系統行為 |
5xx | 限流或內容錯誤等。 | 函數計算系統內部按指數退避自動重試。初始重試間隔為500毫秒,最大重試時長為30分鐘。 |
4xx | 無權限、請求參數不正確(如目標服務的資源已被刪除)或請求消息體超過目標服務限額等。 | 返回錯誤并記錄錯誤信息。 |
結果回調指標
當回調目標服務失敗后,函數計算會記錄相應指標并展示到控制臺。您可以登錄函數計算控制臺,在左側導航欄選擇 ,然后在服務名稱列表單擊目標服務名稱,查看服務維度的指標情況。關于目標服務功能的指標,如下所示:
指標名稱 | 描述 |
目標觸發失敗(FunctionDestinationErrors) | 函數異步調用配置Destination時,函數執行中觸發目標失敗的請求數。按1分鐘或1小時粒度統計求和。 |
目標觸發成功(FunctionDestinationSucceed) | 函數異步調用配置Destination時,函數執行中觸發目標成功的請求數。按1分鐘或1小時粒度統計求和。 |
更多監控指標,請參見監控指標。
更多信息
您還可以通過調用API或使用Serverless Devs工具配置異步調用目標服務。更多信息,請參見API參考和Serverless Devs操作命令。
HTTP函數不支持作為回調目標函數,但HTTP函數支持同步調用和異步調用,更多信息,請參見HTTP調用方式。
您還可以在配置異步調用結果回調功能的同時開啟異步任務模式,具體信息,請參見異步任務。