Function Compute接收非同步呼叫請求後,將請求持久化後會立即返迴響應,無需等待請求執行完成。如您需要保留執行失敗且超過最大重試次數被丟棄的請求,或通知下遊非同步呼叫結果,可以通過配置結果回調功能實現。配置非同步目標服務後,非同步呼叫請求執行完成後,Function Compute根據執行結果自動回調對應的服務。
功能原理
結果回調流程如下圖所示。
適用情境
儲存丟棄的事件供後續使用
當非同步請求執行失敗,並且按照指定的策略重試後仍然失敗,Function Compute將丟棄該請求。如果您配置了失敗目標,Function Compute將自動把失敗請求的上下文資訊推送到雲訊息佇列 RocketMQ 版等Message Service中,以便後續處理。您也可以將目標服務設定為另一個函數,Function Compute將自動把失敗請求的上下文資訊推送到該函數,執行您自訂的錯誤處理邏輯。
自動通知下遊服務執行結果
請求執行成功後,如果您配置了成功目標,Function Compute系統會自動將成功請求的上下文資訊推送到下遊目標服務。例如,您配置了使用Function Compute實現自動解壓上傳到OSS的ZIP檔案,解壓完成後想要接收訊息通知,可採用為目標函數配置非同步呼叫結果回調目標服務。
支援的非同步呼叫目標服務
當您為函數配置了非同步呼叫目標,並且非同步呼叫後的結果符合條件時,Function Compute會將請求上下文和資料推送至對應服務。您可以針對不同函數、別名和版本配置不同的目標服務。目前支援的非同步呼叫目標服務如下:
輕量訊息佇列(原 MNS)
Function Compute
事件匯流排EventBridge
雲訊息佇列 RocketMQ 版
僅支援將Function Compute的事件函數配置為目標服務,不支援將HTTP函數配置為目標服務。關於事件函數和HTTP函數的更多資訊,請參見函數類型選型。
非同步呼叫目標服務的配置說明如下:
非同步呼叫目標的事件內容
輕量訊息佇列(原 MNS)、Function Compute或雲訊息佇列 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時,說明Function Compute對您的函數進行了重試。
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
Function Compute:128 KB
事件匯流排EventBridge:64 KB
雲訊息佇列 RocketMQ 版:4 MB
避免迴圈調用
當您在配置非同步執行目標時,請務必保證不要出現迴圈調用的情況。例如,您為函數A配置了成功調用時的非同步目標為函數B,為函數B配置了成功調用時的非同步目標為函數A。當您非同步觸發函數A並且執行成功後,則可能出現A到B,再到A的迴圈調用的情況。
配置非同步呼叫目標服務
配置非同步呼叫目標前,請先建立函數並確保服務中函數所使用的角色具有對應的雲端服務許可權。具體資訊,請參見授予Function Compute訪問其他雲端服務的許可權。
輕量訊息佇列(原 MNS):mns:SendMessage或mns:PublishMessage。
Function Compute:fc:InvokeFunction。
事件匯流排EventBridge:eventbridge:PutEvents。
雲訊息佇列 RocketMQ 版:mq:PUB。
- 登入Function Compute控制台,在左側導覽列,單擊服務及函數。
- 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
在函數管理頁面,單擊目標函數名稱,然後在目標函數詳情頁面,單擊非同步配置頁簽。
在非同步配置頁簽,按需配置參數資訊。
配置成功目標
在成功目標地區,單擊編輯。
在編輯成功目標面板,成功時調用其他服務選擇啟用,然後配置當請求執行成功後需要發送結果的目標雲端服務。參數資訊如下:
參數
說明
目標服務
Function Compute。當目標服務選擇的是Function Compute時,需配置以下參數資訊:
服務名稱:指定目標服務的名稱。
版本或別名:指定服務的別名或版本。
函數名稱:指定目標函數的名稱。
說明僅支援將Function Compute的事件函數配置為目標服務,不支援將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": "" }
回調失敗的處理
當服務角色無目標服務存取權限或目標服務不可用時,回調目標服務可能會失敗。Function Compute提供了相關的指標及日誌,您可以根據需要進行相應處理。常見的錯誤及系統行為如下所示:
錯誤碼 | 錯誤原因 | 系統行為 |
5xx | 限流或內容錯誤等。 | Function Compute系統內部按指數退避自動重試。初始稍候再試為500毫秒,最大重試時間長度為30分鐘。 |
4xx | 無許可權、請求參數不正確(如目標服務的資源已被刪除)或請求訊息體超過目標服務限額等。 | 返回錯誤並記錄錯誤資訊。 |
結果回調指標
當回調目標服務失敗後,Function Compute會記錄相應指標並展示到控制台。您可以登入Function Compute控制台,在左側導覽列選擇,然後在服務名稱列表單擊目標服務名稱,查看服務維度指標情況。關於目標服務功能的指標,如下所示:
指標名稱 | 描述 |
目標觸發失敗(FunctionDestinationErrors) | 函數非同步呼叫配置Destination時,函數執行中觸發目標失敗的請求數。按1分鐘或1小時粒度統計求和。 |
目標觸發成功(FunctionDestinationSucceed) | 函數非同步呼叫配置Destination時,函數執行中觸發目標成功的請求數。按1分鐘或1小時粒度統計求和。 |
更多監控指標,請參見監控指標。
更多資訊
您還可以通過調用API或使用Serverless Devs工具配置非同步呼叫目標服務。更多資訊,請參見API參考和Serverless Devs常用命令。
HTTP函數不支援作為回調目標函數,但HTTP函數支援同步調用和非同步呼叫,更多資訊,請參見HTTP調用方式。
您還可以在配置非同步呼叫結果回調功能的同時開啟非同步任務模式,具體資訊,請參見非同步任務。