解密函式計算非同步任務能力之「任務的狀態及生命週期管理」

阿里巴巴雲原生發表於2022-07-04

作者:漸意

前言

任務系統中有一類很重要的概念,即任務的狀態和生命管理週期。其本質是對任務的生命週期管理。細分的狀態有助於在使用時能夠更清楚的瞭解系統發生了什麼內容,便於針對性的根據業務情況進行操作。函式計算 Serverless Task 提供了多種可查詢的狀態,並提供了各狀態間轉移的時間點。在函式的執行層面,函式計算也提供了任務的生命週期管理概念,使用者可以根據需求決定當系統對任務例項進行初始化、回收等一系列動作時的執行邏輯,實現完整的執行時生命週期管理。本文將分別對任務執行狀態及執行時管理這兩個方面的內容進行介紹。

任務的狀態及生命週期的管理

任務的狀態管理

 title=

當使用者提交任務並收到提交成功的返回後,任務便已經進入系統對其生命週期的管理流程中。一個任務的狀態變更由內部的一個狀態機負責管理,並對外透出狀態支援實時查詢。整個狀態轉換圖如下所示:

 title=

圖 1

  1. 使用者觸發一次任務後,任務入隊,變更為 Enqueued 狀態,並返回觸發成功;
  2. 任務在函式計算後端服務中出隊,任務變為 Dequeued 狀態;
  3. 後端會檢查任務配置。如果

<!---->

    1. 配置了非同步訊息有效期功能,並且該訊息出隊時間與入隊時間之差已超過有效期,則任務被丟棄,變更為 Expired 狀態。任務終止;
    2. 任務對應的函式已被刪除,或建立例項出現錯誤,則丟棄訊息,任務變更為 Invalid 狀態;

<!---->

  1. 檢查後任務正式進入 Running 狀態。此時任務已觸發實際的執行;
  2. 任務執行完成後,根據返回會變更為以下幾個狀態:

<!---->

    1. Retrying:使用者配置了重試次數(預設為 3),且任務執行失敗,這時會進入重試中狀態,之後會變更為 Running 狀態;
    2. Failed:任務執行失敗,且超過了重試次數。此時會將任務狀態改為 Failed;
    3. Succeeded:任務執行成功。

<!---->

  1. 如果在整個狀態流轉過程使用者觸發 Cancel,則任務會先變更為 Stopping 狀態,並嘗試停止任務執行。當任務停止執行成功後,任務進入 Stopped 狀態。

任務執行時管理及生命週期

當任務狀態進入 Running 後,任務的實際執行便已交給函式計算的執行時。在安全性方面,函式計算會按照 VM 對不同賬號進行隔離,同一個賬號下的函式可能執行於同一個 VM 中。VM 內有一個負責管理容器的客戶端,來實際觸發函式的執行,並收集執行結果。

使用者的執行例項有幾個不同的狀態:

 title=

圖 2

函式計算對上述所有例項狀態變化的過程均提供介面,支援使用者側配置相應的邏輯。

  1. 建立完成 -> 執行請求階段:支援 Initializer 功能,支援初始化例項操作。使用者可以配置諸如全域性變數、連線池初始化等相關操作;
  2. 執行中 -> 執行完成後 Pause 例項:支援 PreFreeze 介面,支援在函式 Pause 例項前執行使用者側的自定義邏輯;
  3. 執行中 -> 外部 cancel:函式計算會強制 Restart 使用者例項,在 Restart 前支援 PreStop 介面。使用者可以配置優雅停止的相關邏輯,以便支援 Cancel 時的自定義行為;
  4. 完成後 Pause -> 銷燬例項:當一段時間沒有請求後,函式計算將銷燬例項。此時會呼叫 PreStop 介面,使用者可以配置銷燬容器的行為(如關閉連線池等)。

 title=

圖 3

任務的停止操作

目前階段函式計算支援了停止單一任務的操作。當使用者操作停止時,支援配置 PreStop 介面,在停止前進行一系列的資源回收工作。停止操作使用者可以使用 SDK 或控制檯來進行呼叫。以 Go 語言為例,停止一次執行的虛擬碼如下所示:\


import fc "github.com/aliyun/fc-go-sdk"

func CancelJob() {
    stopInput := fc.NewStopStatefulAsyncInvocationInput("ServiceName", "FunctionName", "TaskUUID")
    output, err := fcClient.StopStatefulAsyncInvocation(stopInput)
    ...
}

總結

Serverless Task 提供了每個任務的狀態細節,並會對這些細節進行實時的持久化。使用者可以根據需要對這些狀態資訊進行實時的查詢,並根據執行及業務情況進行相應的操作。在任務的執行階段,函式計算提供了所有例項狀態轉移過程中的相關介面,支援使用者自定義任務執行前後的邏輯。結合 PreStop 功能及 Cancel 停止任務功能,使用者可以方便的實現任務的優雅操作。

往期回顧

非同步任務處理系統,如何解決業務長耗時、高併發難題?

函式計算非同步任務能力介紹 - 任務觸發去重


1 分鐘 Serverless 極速搭建真網站

 title=

使用 Serverless 1 分鐘輕鬆搭建你的首個個人網站!

免費額度,輕鬆上手!小白也可極速建站:無需考慮伺服器和網站原始碼,我們為你提供免費計算資源,運維管理伺服器。活動期間完成場景體驗,即有機會領取天貓超市 10 元代金券。(建議 pc 端體驗)

活動時間: 2022 年 6 月 20 日-7 月 1 日(工作日期間領取)

*答疑群: 釘釘搜尋 “44700570”*

體驗地址: 點選閱讀原文 or 掃描二維碼

 title=

點選此處,直達體驗!

相關文章