新聞中心
一、前言
任務(wù)系統(tǒng)中有一類很重要的概念,即任務(wù)的狀態(tài)。其本質(zhì)是對任務(wù)的生命周期管理。細分的狀態(tài)有助于在使用時能夠更清楚的了解系統(tǒng)發(fā)生了什么內(nèi)容,便于針對性的根據(jù)業(yè)務(wù)情況進行操作。函數(shù)計算 Serverless Task 提供了多種可查詢的狀態(tài),并提供了各狀態(tài)間轉(zhuǎn)移的時間點。在函數(shù)的執(zhí)行層面,函數(shù)計算也提供了任務(wù)的生命周期管理概念,用戶可以根據(jù)需求決定當(dāng)系統(tǒng)對任務(wù)實例進行初始化、回收等一系列動作時的執(zhí)行邏輯,實現(xiàn)完整的運行時生命周期管理。本文將分別對任務(wù)運行狀態(tài)及運行時管理這兩個方面的內(nèi)容進行介紹。

二、任務(wù)的狀態(tài)及生命周期的管理
1.任務(wù)的狀態(tài)管理
|
執(zhí)行狀態(tài) |
說明 |
|
Enqueued |
用戶觸發(fā)的 Task 異步消息已進入內(nèi)部隊列,等待處理。 |
|
Dequeued |
Task 異步消息已從函數(shù)計算后端服務(wù)出隊,等待觸發(fā)。 |
|
Running |
Task 調(diào)用執(zhí)行中。 |
|
Succeeded |
Task 調(diào)用執(zhí)行成功。 |
|
Failed |
Task 調(diào)用執(zhí)行失敗。 |
|
Stopped |
Task 調(diào)用因用戶 Cancel 而執(zhí)行終止。 |
|
Stopping |
Task 調(diào)用因用戶 Cancel ,嘗試停止任務(wù)中。 |
|
Expired |
您給異步消息配置了有效期,該消息因過期已被丟棄(未觸發(fā))。 |
|
Invalid |
您的執(zhí)行因函數(shù)或服務(wù)被刪除等原因處于無效狀態(tài)(未觸發(fā))。 |
|
Retrying |
Task 調(diào)用因執(zhí)行錯誤重試中。 |
當(dāng)用戶提交任務(wù)并收到提交成功的返回后,任務(wù)便已經(jīng)進入系統(tǒng)對其生命周期的管理流程中。一個任務(wù)的狀態(tài)變更由內(nèi)部的一個狀態(tài)機負責(zé)管理,并對外透出狀態(tài)支持實時查詢。整個狀態(tài)轉(zhuǎn)換圖如下所示:
圖 1
- 用戶觸發(fā)一次任務(wù)后,任務(wù)入隊,變更為 Enqueued 狀態(tài),并返回觸發(fā)成功;
- 任務(wù)在函數(shù)計算后端服務(wù)中出隊,任務(wù)變?yōu)?Dequeued 狀態(tài);
- 后端會檢查任務(wù)配置。如果:
配置了異步消息有效期功能,并且該消息出隊時間與入隊時間之差已超過有效期,則任務(wù)被丟棄,變更為 Expired 狀態(tài)。任務(wù)終止;
任務(wù)對應(yīng)的函數(shù)已被刪除,或創(chuàng)建實例出現(xiàn)錯誤,則丟棄消息,任務(wù)變更為 Invalid 狀態(tài);
- 檢查后任務(wù)正式進入 Running 狀態(tài)。此時任務(wù)已觸發(fā)實際的執(zhí)行;
- 任務(wù)執(zhí)行完成后,根據(jù)返回會變更為以下幾個狀態(tài):
Retrying:用戶配置了重試次數(shù)(默認為 3),且任務(wù)執(zhí)行失敗,這時會進入重試中狀態(tài),之后會變更為 Running 狀態(tài);
Failed:任務(wù)執(zhí)行失敗,且超過了重試次數(shù)。此時會將任務(wù)狀態(tài)改為 Failed;
Succeeded:任務(wù)執(zhí)行成功。
- 如果在整個狀態(tài)流轉(zhuǎn)過程用戶觸發(fā) Cancel,則任務(wù)會先變更為 Stopping 狀態(tài),并嘗試停止任務(wù)執(zhí)行。當(dāng)任務(wù)停止執(zhí)行成功后,任務(wù)進入 Stopped 狀態(tài)。
2.任務(wù)運行時管理及生命周期
當(dāng)任務(wù)狀態(tài)進入 Running 后,任務(wù)的實際執(zhí)行便已交給函數(shù)計算的運行時。在安全性方面,函數(shù)計算會按照 VM 對不同賬號進行隔離,同一個賬號下的函數(shù)可能運行于同一個 VM 中。VM 內(nèi)有一個負責(zé)管理容器的客戶端,來實際觸發(fā)函數(shù)的執(zhí)行,并收集執(zhí)行結(jié)果。用戶的運行實例有幾個不同的狀態(tài):
圖 2
函數(shù)計算對上述所有實例狀態(tài)變化的過程均提供接口,支持用戶側(cè)配置相應(yīng)的邏輯。
- 創(chuàng)建完成 -> 執(zhí)行請求階段:支持 Initializer 功能,支持初始化實例操作。用戶可以配置諸如全局變量、連接池初始化等相關(guān)操作;
- 執(zhí)行中 -> 執(zhí)行完成后 Pause 實例:支持 PreFreeze 接口,支持在函數(shù) Pause 實例前執(zhí)行用戶側(cè)的自定義邏輯;
- 執(zhí)行中 -> 外部 cancel:函數(shù)計算會強制 Restart 用戶實例,在 Restart 前支持 PreStop 接口。用戶可以配置優(yōu)雅停止的相關(guān)邏輯,以便支持 Cancel 時的自定義行為;
- 完成后 Pause -> 銷毀實例:當(dāng)一段時間沒有請求后,函數(shù)計算將銷毀實例。此時會調(diào)用 PreStop 接口,用戶可以配置銷毀容器的行為(如關(guān)閉連接池等)。
圖 3
3.任務(wù)的停止操作
目前階段函數(shù)計算支持了停止單一任務(wù)的操作。當(dāng)用戶操作停止時,支持配置 PreStop 接口,在停止前進行一系列的資源回收工作。停止操作用戶可以使用 SDK 或控制臺來進行調(diào)用。以 Go 語言為例,停止一次執(zhí)行的偽代碼如下所示:
import fc "github.com/aliyun/fc-go-sdk"
func CancelJob() {
stopInput := fc.NewStopStatefulAsyncInvocationInput("ServiceName", "FunctionName", "TaskUUID")
output, err := fcClient.StopStatefulAsyncInvocation(stopInput)
...
}
三、總結(jié)
Serverless Task 提供了每個任務(wù)的狀態(tài)細節(jié),并會對這些細節(jié)進行實時的持久化。用戶可以根據(jù)需要對這些狀態(tài)信息進行實時的查詢,并根據(jù)執(zhí)行及業(yè)務(wù)情況進行相應(yīng)的操作。在任務(wù)的運行階段,函數(shù)計算提供了所有實例狀態(tài)轉(zhuǎn)移過程中的相關(guān)接口,支持用戶自定義任務(wù)執(zhí)行前后的邏輯。結(jié)合 PreStop 功能及 Cancel 停止任務(wù)功能,用戶可以方便的實現(xiàn)任務(wù)的優(yōu)雅操作。?
網(wǎng)站題目:解密函數(shù)計算異步任務(wù)能力之任務(wù)的狀態(tài)及生命周期管理
URL標(biāo)題:http://www.dlmjj.cn/article/cdiieog.html


咨詢
建站咨詢
