全部產品
Search
文件中心

Function Compute:非同步任務最佳實務

更新時間:Sep 09, 2025

非同步任務可以即時感知業務狀態、控制執行函數,讓您對一些異常情況進行更好的處理,例如警示通知、自動化重試等。本文介紹如何結合使用Serverless Devs和Function Compute控制台實現非同步呼叫任務。

背景資訊

FaaS早期主要支援無狀態、短時和輕量級的計算能力,例如API後端、圖片處理和資料流式處理等。在各類情境中,對於FaaS函數的調用方式可分為非同步呼叫和同步調用。同步調用和非同步呼叫存在的差異是同步調用會立即執行函數,而非同步呼叫則會立刻返回調用方202 HttpCode,並將非同步呼叫訊息入隊,由後端服務排隊處理。

使用情境

隨著業務的發展,一些線上直播情境的使用者在慢慢遷移至FaaS內,這類業務情境通常具有執行時間長、對延時敏感和可用性要求高等特徵,開發人員需即時感知業務狀態和控制函數的執行。由於非同步呼叫對延時不敏感,同步調用長連結的穩定性比較差,並且佔用用戶端資源,所以既無法使用非同步呼叫也無法使用同步調用。但由於非同步呼叫在大量突增流量的離線業務下,具有削峰填穀的特點,可以平滑緩衝對業務下遊系統的衝擊,所以Function Compute對非同步呼叫進行相關拓展,引入非同步任務。非同步任務主要適用於以下業務情境:

  • 對執行具有可觀測性

    • 在執行過程中您可以即時查看執行的狀態,例如是否已出隊、是否已觸發函數執行和執行結果是否已正常發送給結果回調目標。

    • 業務具有明顯的任務屬性,如下所示:

      • 可以查看某個執行的觸發事件和即時的執行日誌。

      • 可以根據執行的名稱、執行的時間或執行的狀態等過濾查詢記錄。

  • 對執行具有可操作性

    業務具有明顯的任務屬性,如下所示:

    • 當執行時間較長時,在某些情況下可以手動停止執行函數。

    • 可以重新執行歷史失敗或成功的執行。

關於非同步任務的詳細資料,請參見非同步任務

準備工作

  • 快速入門

  • 配置Serverless Devs

  • 建立SMQ隊列。詳細資料,請參見建立隊列

  • 建立RAM角色,並授予以下權限原則,您也可以直接使用AliyunFCDefaultRolePolicy策略。關於權限原則的詳細資料,請參見建立RAM角色

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "fc:InvokeFunction",
                    "mns:SendMessage",
                    "mns:PublishMessage",
                    "log:*"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }

操作步驟

您可以通過非同步任務實現以下效果:

  • 函數開始非同步執行後,您可以通過Function Compute控制台、SDK或API查看操作執行。

  • 當函數執行失敗或手動停止後,Function Compute系統會將非同步訊息推送至Simple Message Queue (formerly MNS)的隊列中實現無效信件佇列的功能,方便您感知非同步函數執行失敗的訊息並進行後續處理。

  1. 執行以下命令,複製專案工程。

    git clone https://github.com/awesome-fc/Stateful-Async-Invocation.git
  2. 執行以下命令,進入專案目錄。

    cd Stateful-Async-Invocation
  3. 修改s.yaml檔案。

    完整的s.yaml範例程式碼如下。實際使用過程中,需修改{accountid}的值為您的阿里雲帳號ID,修改{myqueue}的值為您配置的非同步呼叫目標Simple Message Queue (formerly MNS)的隊列名稱。

    edition: 3.0.0
    name: stateful-async-inovcation-demo
    access: default
    resources:
      fc-job:
        component: fc3
        props:
          region: cn-hangzhou
          description: this is test
          handler: index.handler
          memorySize: 128
          runtime: python3
          instanceConcurrency: 1
          timeout: 60
          internetAccess: true
          role: acs:ram::{accountid}:role/aliyunfcdefaultrole
          functionName: my-fc-job
          code: ./code
          asyncInvokeConfig:
            maxAsyncEventAgeInSeconds: 172800
            maxAsyncRetryAttempts: 1
            asyncTask: true
            qualifier: LATEST
            destinationConfig:
              onSuccess:
                destination: acs:mns:cn-hangzhou:{accountid}:/queues/{myqueue}/messages
              onFailure:
                destination: acs:mns:cn-hangzhou:{accountid}:/queues/{myqueue}/messages
  4. 在目標目錄中執行以下命令部署函數。

    sudo s deploy

    部署成功後,您可以登入Function Compute控制台,查看是否成功建立函數並為該函數開啟非同步任務功能。

結果驗證

  1. 您可以通過Serverless Devs工具非同步呼叫上一步部署的函數,範例程式碼如下。

    sudo s invoke --invocation-type Async -e '{"failure":true}'

    您也可以通過Function Compute控制台查看、操作非同步呼叫。更多資訊,請參見任務管理

    說明

    如果您需要查看詳細資料例如函數日誌,您需要為函數配置Log Service。詳細資料,請參見配置日誌

  2. 當函數調用結束後,如已配置了結果回調目標,則可前往目標查看推送記錄。

    本文樣本中,配置的結果回調目標為Simple Message Queue (formerly MNS)的隊列,您可以在輕量訊息佇列(原MNS)控制台接收推送的資訊,如下所示。

    {
        "timestamp": 1728465119433,
        "requestContext": {
            "requestId": "1-670648a1-15197d0b-d07710222f9d",
            "functionArn": "acs:fc:cn-hangzhou:1034354682****:functions/my-fc-job",
            "condition": "InvocationError",
            "approximateInvokeCount": 2
        },
        "requestPayload": "{\"failure\":true}",
        "responseContext": {
            "statusCode": 200,
            "functionError": "InvocationError"
        },
        "responsePayload": "{\"errorMessage\":\"Function timed out after 60 seconds (maxMemoryUsage: 8MB)\"}"
    }
    說明

    當非同步呼叫失敗或手動終止後,您可以在Simple Message Queue (formerly MNS)中接收到非同步呼叫的詳細錯誤資訊。