詳解異步任務(wù):任務(wù)的狀態(tài)及生命周期管理

前言
任務(wù)的狀態(tài)
圖 11、用戶觸發(fā)一次任務(wù)后,任務(wù)入隊(duì),變更為 Enqueued 狀態(tài),并返回觸發(fā)成功;
2、任務(wù)在函數(shù)計(jì)算后端服務(wù)中出隊(duì),任務(wù)變?yōu)?Dequeued 狀態(tài);
3、后端會(huì)檢查任務(wù)配置。如果:
配置了異步消息有效期功能,并且該消息出隊(duì)時(shí)間與入隊(duì)時(shí)間之差已超過有效期,則任務(wù)被丟棄,變更為 Expired 狀態(tài)。任務(wù)終止;
任務(wù)對(duì)應(yīng)的函數(shù)已被刪除,或創(chuàng)建實(shí)例出現(xiàn)錯(cuò)誤,則丟棄消息,任務(wù)變更為 Invalid 狀態(tài);
4、檢查后任務(wù)正式進(jìn)入 Running 狀態(tài)。此時(shí)任務(wù)已觸發(fā)實(shí)際的執(zhí)行;
5、任務(wù)執(zhí)行完成后,根據(jù)返回會(huì)變更為以下幾個(gè)狀態(tài):
Retrying:用戶配置了重試次數(shù)(默認(rèn)為 3),且任務(wù)執(zhí)行失敗,這時(shí)會(huì)進(jìn)入重試中狀態(tài),之后會(huì)變更為 Running 狀態(tài);
Failed:任務(wù)執(zhí)行失敗,且超過了重試次數(shù)。此時(shí)會(huì)將任務(wù)狀態(tài)改為 Failed;
Succeeded:任務(wù)執(zhí)行成功。
6、如果在整個(gè)狀態(tài)流轉(zhuǎn)過程用戶觸發(fā) Cancel,則任務(wù)會(huì)先變更為 Stopping 狀態(tài),并嘗試停止任務(wù)執(zhí)行。當(dāng)任務(wù)停止執(zhí)行成功后,任務(wù)進(jìn)入 Stopped 狀態(tài)。
當(dāng)任務(wù)狀態(tài)進(jìn)入 Running 后,任務(wù)的實(shí)際執(zhí)行便已交給函數(shù)計(jì)算的運(yùn)行時(shí)。
在安全性方面,函數(shù)計(jì)算會(huì)按照 VM 對(duì)不同賬號(hào)進(jìn)行隔離,同一個(gè)賬號(hào)下的函數(shù)可能運(yùn)行于同一個(gè) VM 中。VM 內(nèi)有一個(gè)負(fù)責(zé)管理容器的客戶端,來實(shí)際觸發(fā)函數(shù)的執(zhí)行,并收集執(zhí)行結(jié)果。
用戶的運(yùn)行實(shí)例有幾個(gè)不同的狀態(tài):

函數(shù)計(jì)算對(duì)上述所有實(shí)例狀態(tài)變化的過程均提供接口,支持用戶側(cè)配置相應(yīng)的邏輯。
1、創(chuàng)建完成 -> 執(zhí)行請(qǐng)求階段:支持 Initializer 功能,支持初始化實(shí)例操作。用戶可以配置諸如全局變量、連接池初始化等相關(guān)操作;
2、執(zhí)行中 -> 執(zhí)行完成后 Pause 實(shí)例:支持 PreFreeze 接口,支持在函數(shù) Pause 實(shí)例前執(zhí)行用戶側(cè)的自定義邏輯;
3、執(zhí)行中 -> 外部 cancel:函數(shù)計(jì)算會(huì)強(qiáng)制 Restart 用戶實(shí)例,在 Restart 前支持 PreStop 接口。用戶可以配置優(yōu)雅停止的相關(guān)邏輯,以便支持 Cancel 時(shí)的自定義行為;
4、完成后 Pause -> 銷毀實(shí)例:當(dāng)一段時(shí)間沒有請(qǐng)求后,函數(shù)計(jì)算將銷毀實(shí)例。此時(shí)會(huì)調(diào)用 PreStop 接口,用戶可以配置銷毀容器的行為(如關(guān)閉連接池等)。
圖 3目前階段函數(shù)計(jì)算支持了停止單一任務(wù)的操作。
當(dāng)用戶操作停止時(shí),支持配置 PreStop 接口,在停止前進(jìn)行一系列的資源回收工作。停止操作用戶可以使用 SDK 或控制臺(tái)來進(jìn)行調(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é)

1、異步任務(wù)處理系統(tǒng),如何解決業(yè)務(wù)長(zhǎng)耗時(shí)、高并發(fā)難題?
戳下方,詳細(xì)了解 函數(shù)計(jì)算!