Serverless Computing概念
????云原生計算基金會CNCF(Cloud Native Computing Foundation, CNCF)Serverless Whitepaper v1.0對無服務(wù)器計算作了如下定義:
Serverless computing refers to the concept of building and running applications that do not require server management. It describes a finer-grained deployment model where applications, bundled as one or more functions, are uploaded to a platform and then executed, scaled, and billed in response to the exact demand needed at the moment.
????無服務(wù)器計算(Serverless Computing)是指在構(gòu)建和運行應(yīng)用時無需管理服務(wù)器等基礎(chǔ)設(shè)施玖雁。它描述了一個更細(xì)粒度的部署模型蜒谤,在該模型中肪康,應(yīng)用被拆解為一個或多個細(xì)粒度的函數(shù)被上傳到一個平臺,然后根據(jù)當(dāng)前所需執(zhí)行场航、擴(kuò)展和計費。
????無服務(wù)器計算并不意味著我們不再使用服務(wù)器來承載和運行代碼,也不意味著不再需要運維工程師禀横。而是指無服務(wù)器計算的消費者不再需要花費時間和資源在服務(wù)器配置们陆、維護(hù)寒瓦、更新、擴(kuò)展和容量規(guī)劃上坪仇。所有這些任務(wù)和功能都由無服務(wù)器平臺處理杂腰,并且完全從開發(fā)人員和IT/操作團(tuán)隊中抽象出來。因此椅文,開發(fā)人員專注于編寫應(yīng)用程序的業(yè)務(wù)邏輯喂很。運營工程師能夠?qū)⑺麄兊闹攸c提升到更關(guān)鍵的業(yè)務(wù)任務(wù)上。?
FaaS & BaaS
無服務(wù)器計算平臺可以提供以下一種或兩種服務(wù):
1. FaaS(Functions-as-a-Service-函數(shù)即服務(wù))皆刺,通常提供事件驅(qū)動(event-driving)的計算少辣。開發(fā)人員使用由事件(event)或HTTP請求觸發(fā)的函數(shù)運行和管理應(yīng)用程序代碼。開發(fā)人員將小的代碼單元部署到FaaS羡蛾,F(xiàn)aaS按需執(zhí)行和擴(kuò)展毒坛,開發(fā)人員無需管理服務(wù)器或任何其他底層基礎(chǔ)設(shè)施。
2. Baas(Backend-as-a-Service后端即服務(wù)),是第三方基于API的服務(wù)煎殷,用于替換應(yīng)用程序中的核心功能子集屯伞。因為這些API是作為一個自動擴(kuò)縮容和透明操作的服務(wù)提供的,所以開發(fā)人員認(rèn)為這是無服務(wù)器的 豪直,如:OSS
Pros & Cons
無服務(wù)器計算(Serverless Computing)應(yīng)用利弊大致如下:
Pros:
1. 0服務(wù)器操作劣摇。無服務(wù)器通過消除維護(hù)服務(wù)器資源所涉及的開銷,極大地改變了運行軟件應(yīng)用程序的成本模型弓乙。
2. 沒有配置末融、更新和管理服務(wù)器基礎(chǔ)結(jié)構(gòu)。
3. 彈性伸縮:無服務(wù)器FaaS或BaaS產(chǎn)品可以立即精確地伸縮以處理每個單獨的傳入請求暇韧。對于開發(fā)人員來說勾习,無服務(wù)器平臺沒有“預(yù)先計劃的容量”的概念,也不需要配置“自動伸縮”觸發(fā)器或規(guī)則懈玻。在沒有開發(fā)人員干預(yù)的情況下巧婶,自動進(jìn)行縮放。在完成請求處理后涂乌,無服務(wù)器FaaS會自動縮小計算資源的規(guī)模艺栈,以確保永遠(yuǎn)沒有空閑的容量。
4. 低成本湾盒。無服務(wù)器計算服務(wù)對空閑的虛擬機(jī)或容器不收費湿右;也就是說當(dāng)代碼沒有運行或沒有進(jìn)行有意義的工作時,不收費罚勾。?
Cons:
1. 作為一種新興的計算模型毅人、缺乏標(biāo)準(zhǔn)化和生態(tài)系統(tǒng)成熟度。
2. 由于運行時更具動態(tài)性尖殃,與iaas和paas相比堰塌,調(diào)試可能更具挑戰(zhàn)性。
3. 由于按需結(jié)構(gòu)分衫,如果運行時在空閑時刪除函數(shù)的所有實例场刑,則某些無服務(wù)器運行時的“冷啟動”方面可能是性能問題。
4. 在更復(fù)雜的情況下(例如蚪战,觸發(fā)其他功能的功能)牵现,對于相同數(shù)量的邏輯,可以有更多的操作表面積邀桑。
Serverless處理模型(Serverless Processing Model)
CNCF白皮書對于無服務(wù)器框架中的函數(shù)用法瞎疼,函數(shù)約束、生命周期壁畸、調(diào)用類型和所需的抽象等定義了規(guī)范贼急,以便同一個函數(shù)可以一次性編碼茅茂,并在不同的無服務(wù)器框架中使用。?
FaaS解決方案概括為具有以下圖中所示的幾個關(guān)鍵元素:
1. 事件源(Event sources)-觸發(fā)器或流事件到一個或多個函數(shù)實例中
2. 函數(shù)實例(Function instances)-單個函數(shù)/微服務(wù)太抓,可根據(jù)需求進(jìn)行擴(kuò)展
3. FaaS控制器(FaaS Controller)-部署空闲、控制和監(jiān)視函數(shù)實例及其源
4. 平臺服務(wù)(Platform services?)-FaaS解決方案使用的通用集群或云服務(wù)(有時稱為后端即服務(wù)-BaaS)
CNCF函數(shù)相關(guān)規(guī)范
函數(shù)定義(Function Definition)
無服務(wù)器函數(shù)定義可以包含以下規(guī)范和元數(shù)據(jù),函數(shù)定義是特定于版本的:
1. 唯一ID
2. 名字
3. 描述
4. 標(biāo)簽
5. 版本ID(和/或版本別名)
6. 版本創(chuàng)建時間
7. 上次修改時間(函數(shù)定義的)
8. 函數(shù)處理程序
9. 運行時語言
10. 代碼+依賴項或代碼路徑和憑據(jù)
11. 環(huán)境變量
12. 執(zhí)行角色和密鑰
13. 資源(所需的CPU走敌、內(nèi)存)
14. 執(zhí)行超時時間
15. 日志失敳昵恪(死信隊列)
16. 網(wǎng)絡(luò)策略/vpc
17. 數(shù)據(jù)綁定(Metadata Binding)
元數(shù)據(jù)詳細(xì)信息(Metadata details)
1. 版本(Version)-每個函數(shù)版本都應(yīng)該有一個唯一的標(biāo)識符,此外掉丽,可以使用一個或多個別名(例如“最新”跌榔、“生產(chǎn)”、“測試版”)標(biāo)記版本捶障。API網(wǎng)關(guān)和事件源將流量/事件路由到特定的函數(shù)版本僧须。
2. 環(huán)境變量(Environment Variables)-用戶可以指定將在運行時提供給函數(shù)的環(huán)境變量。環(huán)境變量也可以從機(jī)密和加密內(nèi)容派生项炼,或者從平臺變量派生(例如担平,kubernetes envvar定義)。環(huán)境變量使開發(fā)人員能夠控制函數(shù)行為和參數(shù)芥挣,而無需修改代碼和/或重建函數(shù)驱闷,從而獲得更好的開發(fā)人員體驗和函數(shù)重用耻台。
3. 執(zhí)行角色(Execution Role)-該函數(shù)應(yīng)在特定的用戶或角色標(biāo)識下運行空免,該標(biāo)識授予并審核其對平臺資源的訪問權(quán)限。
4. 資源(Resources)-定義功能所需的或最大的硬件資源盆耽,如內(nèi)存和CPU蹋砚。
5. 超時(Timeout)-指定函數(shù)調(diào)用在被平臺終止之前可以運行的最長時間。
6. 失敗日志(死信隊列)(Failure Log (Dead Letter Queue))-隊列或流的路徑摄杂,用于存儲失敗的函數(shù)執(zhí)行列表坝咐,并提供適當(dāng)?shù)脑敿?xì)信息。
7. 網(wǎng)絡(luò)策略(Network Policy)-分配給功能的網(wǎng)絡(luò)域和策略(用于與外部服務(wù)/資源通信的功能)析恢。
8. 執(zhí)行語義(Execution Semantics)-指定應(yīng)如何執(zhí)行函數(shù)(例如墨坚,每個事件至少執(zhí)行一次、至多執(zhí)行一次映挂、完全執(zhí)行一次)泽篮。
數(shù)據(jù)綁定(Data Bindings)
????一些無服務(wù)器框架允許用戶指定函數(shù)使用的輸入/輸出數(shù)據(jù)資源,這使開發(fā)人員能夠簡化柑船、提高性能(在執(zhí)行之間保留數(shù)據(jù)連接帽撑,可以預(yù)取數(shù)據(jù)等)和更好的安全性(數(shù)據(jù)資源憑據(jù)是上下文的一部分,而不是代碼)鞍时。
????綁定數(shù)據(jù)可以是文件亏拉、對象扣蜻、記錄、消息等形式及塘,函數(shù)規(guī)范可以包括一組數(shù)據(jù)綁定定義莽使,每個定義指定數(shù)據(jù)資源、其憑證和使用參數(shù)磷蛹。數(shù)據(jù)綁定可以引用事件數(shù)據(jù)(例如吮旅,db鍵是從事件“用戶名”字段派生的),示例:https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings
函數(shù)約束(Function Requirements)
函數(shù)和無服務(wù)器運行時應(yīng)該滿足的通用需求:
1. 函數(shù)必須與不同事件類的基礎(chǔ)實現(xiàn)分離
2. 可以從多個事件源調(diào)用函數(shù)
3. 每個調(diào)用方法不需要不同的函數(shù)
4. 事件源可以調(diào)用多個函數(shù)
5. 函數(shù)可能需要與底層平臺服務(wù)進(jìn)行持久綁定的機(jī)制味咳,這可能是跨函數(shù)調(diào)用庇勃。函數(shù)可能是短暫的,但如果需要在每次調(diào)用(例如在日志記錄槽驶、連接和裝載外部數(shù)據(jù)源的情況下)上都進(jìn)行引導(dǎo)责嚷,則引導(dǎo)可能會很昂貴。
6. 每個函數(shù)可以用不同于同一應(yīng)用程序中使用的其他函數(shù)的代碼語言編寫掂铐。
7. 函數(shù)運行時應(yīng)盡可能減少事件序列化和反序列化開銷(例如罕拂,使用本機(jī)語言結(jié)構(gòu)或有效的編碼方案)
函數(shù)調(diào)用類型(Function Invocation Types)
根據(jù)不同的用例,可以從不同的事件源調(diào)用函數(shù)全陨,例如:
1. 同步請求(Synchronous Request (Req/Rep))爆班,例如http請求、grpc調(diào)用
????- 客戶機(jī)發(fā)出請求并等待立即響應(yīng)辱姨。這是一個阻塞呼叫柿菩。
2. 異步消息隊列請求(pub/sub)(Asynchronous Message Queue Request),例如RabbitMQ, AWS SNS, MQTT, Email, Object (S3) change雨涛、計劃事件(如cron作業(yè))
????- 消息發(fā)布到交換并分發(fā)到訂閱服務(wù)器
? ? - 沒有嚴(yán)格的消息順序枢舶, 可一次處理
3. 消息/記錄流(Message/Record Streams):Kafka, AWS Kinesis, AWS DynamoDB Streams, Database CDC
? ? - 一組有序的消息/記錄(必須按順序處理)
? ? - 通常,一個流被分割到多個分區(qū)/碎片(partitions/shards?)替久,每個碎片有一個worker(碎片使用者)
? ? - 流可以從消息凉泄、數(shù)據(jù)庫更新(日志)或文件(例如csv、json蚯根、parquet)生成后众。
? ? - 事件可以推送到函數(shù)運行時,也可以由函數(shù)運行時拉取颅拦。
4. 批處理作業(yè)(Batch Jobs)蒂誉,例如ETL作業(yè)、分布式深度學(xué)習(xí)矩距、HPC模擬
? ? - 作業(yè)(Jobs)被調(diào)度或提交到隊列拗盒,并在運行時使用多個并行函數(shù)實例進(jìn)行處理,每個實例處理工作集(任務(wù))的一個或多個部分锥债。
? ? - 當(dāng)所有并行工作人員成功完成所有計算任務(wù)時陡蝇,作業(yè)完成痊臭。
?
函數(shù)生命周期(Function LifeCycle)
函數(shù)部署管道(Function Deployment Pipeline)
函數(shù)生命周期:
1. 編寫代碼、提供規(guī)范和元數(shù)據(jù)
2. 獲取代碼和規(guī)范登夫,編譯并將其轉(zhuǎn)化為一個工件(二進(jìn)制代碼广匙、包或容器鏡像)
3. 工件部署到一個集群上,控制器實體負(fù)責(zé)根據(jù)事件流量和/或?qū)嵗系呢?fù)載調(diào)整函數(shù)實例的數(shù)量恼策。
函數(shù)操作(Function Operations)
無服務(wù)器框架可能允許以下操作和方法定義和控制功能生命周期:
1. 創(chuàng)建(Create)-創(chuàng)建一個新函數(shù)鸦致,包括其規(guī)范和代碼
2. 發(fā)布(Publish)-創(chuàng)建可部署在群集上的函數(shù)的新版本
3. 更新別名/標(biāo)簽(Update Alias/Label [of a version])-更新版本別名
4. 執(zhí)行/調(diào)用(Execute/Invoke)-不通過事件源調(diào)用特定版本
5. 事件源關(guān)聯(lián)(Event Source association?)-將函數(shù)的特定版本連接到事件源
6. 獲取(Get)-返回函數(shù)元數(shù)據(jù)和規(guī)范
7. 更新(Update)-修改函數(shù)的最新版本
8. 刪除(Delete)-刪除一個函數(shù)涣楷,可以刪除一個特定的版本或函數(shù)的所有版本
9. 清單(List)-顯示函數(shù)及其元數(shù)據(jù)的列表
10. 狀態(tài)獲确滞佟(get stats)-返回有關(guān)函數(shù)運行時使用情況的統(tǒng)計信息
11. 日志獲取(get logs)-返回函數(shù)生成的日志
關(guān)鍵步驟說明:
1. Create:在創(chuàng)建函數(shù)時狮斗,提供其元數(shù)據(jù)(稍后在函數(shù)規(guī)范中描述)作為函數(shù)創(chuàng)建的一部分绽乔,將對其進(jìn)行編譯并可能發(fā)布。稍后可以啟動碳褒、禁用和啟用功能折砸。功能部署需要能夠支持以下用例:
????- 事件流(Event streaming),在這種情況下沙峻,隊列中可能總是有事件睦授,但是可能需要通過顯式請求暫停/恢復(fù)處理。
? ? - 熱啟動(Warm startup)-在任何時候具有最少實例數(shù)的函數(shù)摔寨,例如去枷,接收到的“第一個”事件具有熱啟動,因為該函數(shù)已經(jīng)部署并準(zhǔn)備好服務(wù)于該事件(而不是在“傳入”事件第一次調(diào)用時部署該函數(shù)的冷啟動)祷肯。
2. Publish:用戶可以發(fā)布一個函數(shù)沉填,這將創(chuàng)建一個新版本(最新版本的副本)疗隶,發(fā)布的版本可能會被標(biāo)記/標(biāo)記或有別名佑笋,請參閱下面的詳細(xì)信息。
3. 用戶可能希望為調(diào)試和開發(fā)過程直接執(zhí)行/調(diào)用函數(shù)(繞過事件源或API網(wǎng)關(guān))斑鼻。用戶可以指定調(diào)用參數(shù)蒋纬,如所需版本、同步/異步操作坚弱、詳細(xì)級別等蜀备。
4. 用戶可能希望獲得函數(shù)統(tǒng)計信息(例如調(diào)用次數(shù)、平均運行時間荒叶、平均延遲碾阁、失敗、重試次數(shù)等)些楣,統(tǒng)計信息可以是當(dāng)前度量值或一系列值(例如存儲在Prometheus或云提供程序設(shè)施(如AWS Cloud Watch))脂凶。
5. 用戶可能希望檢索函數(shù)日志數(shù)據(jù)宪睹。這可以根據(jù)嚴(yán)重性級別和/或時間范圍和/或內(nèi)容進(jìn)行篩選。日志數(shù)據(jù)是每個函數(shù)的蚕钦,它包括諸如函數(shù)創(chuàng)建和刪除亭病、顯式錯誤、警告或調(diào)試消息等事件嘶居,還可以選擇函數(shù)的stdout或stderr罪帖。每次調(diào)用最好有一個日志條目,或者一種將日志條目與特定調(diào)用關(guān)聯(lián)的方法(以便更簡單地跟蹤函數(shù)執(zhí)行流)邮屁。
事件源(Event Source)
不同類型的事件源包括:
1. 事件和消息服務(wù)整袁,例如:?RabbitMQ, MQTT, SES, SNS, Google Pub/Sub
2. 存儲服務(wù),例如:S3, DynamoDB, Kinesis, Cognito, Google Cloud Storage, Azure Blob, iguazio V3IO (object/stream/DB)
3. 端點服務(wù)佑吝,例如:物聯(lián)網(wǎng)(IoT)葬项、HTTP網(wǎng)關(guān)(HTTP Gateway)、移動設(shè)備迹蛤、Alexa民珍、Google Cloud Endpoints
4. 配置存儲庫,例如:Git, CodeCommit
5. 使用特定于語言的sdk的用戶應(yīng)用程序
6. 定時事件-允許定期調(diào)用函數(shù)盗飒。
事件源到函數(shù)的關(guān)聯(lián)(Event Source to Function Association)
函數(shù)是由事件源觸發(fā)的事件調(diào)用的嚷量。函數(shù)和事件源之間有一個n:m映射。每個事件源可以用來調(diào)用多個函數(shù)逆趣,一個函數(shù)可以由多個事件源觸發(fā)蝶溶。事件源可以映射到函數(shù)的特定版本或函數(shù)的別名,后者提供了更改函數(shù)的方法宣渗,并部署了一個新版本抖所,而不需要更改事件關(guān)聯(lián)。事件源也可以定義為使用同一函數(shù)的不同版本痕囱,定義應(yīng)為每個函數(shù)分配多少流量田轧。
在創(chuàng)建了一個函數(shù)之后,或者在以后的某個時間點鞍恢,需要將事件源關(guān)聯(lián)起來傻粘,該事件源應(yīng)該作為該事件的結(jié)果觸發(fā)函數(shù)調(diào)用。這需要一組操作和方法帮掉,例如:
1. 創(chuàng)建事件源關(guān)聯(lián)
2. 更新事件源關(guān)聯(lián)
3. 列出事件源關(guān)聯(lián)
函數(shù)輸入(Function Input)
函數(shù)輸入包括事件數(shù)據(jù)(event data)和元數(shù)據(jù)(metadata)弦悉,并且可以包括一個上下文對象(context object)。
事件數(shù)據(jù)和元數(shù)據(jù)(Event data and metadata)
事件詳細(xì)信息應(yīng)傳遞給函數(shù)處理程序蟆炊,不同的事件可能具有不同的元數(shù)據(jù)稽莉,因此函數(shù)需要能夠確定事件的類型并輕松解析通用和特定于事件的元數(shù)據(jù)。
將事件類與實現(xiàn)分離是可取的涩搓,例如:處理消息流的函數(shù)將工作相同污秆,而不管流存儲是Kafka還是Kinesis后室。在這兩種情況下,它都將接收消息體和事件元數(shù)據(jù)混狠,消息可以在不同的框架之間路由岸霹。
事件可以包括單個記錄(例如,在請求/響應(yīng)模型中)将饺,或者接受多個記錄或微批(例如贡避,在流模式中)。
FaaS解決方案使用的常見事件數(shù)據(jù)和元數(shù)據(jù)示例:
- 事件類別
-?版本
-?事件ID
-?事件來源/來源
-?源識別
-?內(nèi)容類型
-?消息體
-?時間戳
事件/記錄特定元數(shù)據(jù)的示例:
-?HTTP: 路徑予弧、方法刮吧、頭、查詢參數(shù)
-?Message Queue:消息隊列:主題掖蛤,標(biāo)題
-?記錄流(Record Stream):表杀捻、鍵、op蚓庭、修改時間致讥、舊字段、新字段
事件源結(jié)構(gòu)示例:
-?AWS Lambda:http://docs.aws.amazon.com/lambda/latest/dg/eventsources.html
-?Microsoft Azure?Functions:https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings
-?Google?Cloud Functions:https://cloud.google.com/functions/docs/concepts/events-triggers
有些實現(xiàn)將JSON作為向函數(shù)傳遞事件信息的機(jī)制來關(guān)注器赞。這可能會增加高速函數(shù)(例如流處理)或低能耗設(shè)備(IOT)的大量序列化/反序列化開銷垢袱。在這些情況下,將本機(jī)語言結(jié)構(gòu)或其他序列化機(jī)制視為選項可能是值得的港柜。
函數(shù)上下文(Function Context)
當(dāng)調(diào)用函數(shù)時请契,框架可能希望提供對跨多個函數(shù)調(diào)用的平臺資源或常規(guī)屬性的訪問,而不是將所有靜態(tài)數(shù)據(jù)放在事件中夏醉,或強(qiáng)制函數(shù)在每次調(diào)用時初始化平臺服務(wù)爽锥。
上下文作為一組輸入屬性、環(huán)境變量或全局變量傳遞畔柔。有些實現(xiàn)使用這三種方法的組合氯夷。
上下文示例:
-?函數(shù)名、版本释树、ARN
-?存儲限制(Memory Limit)
-?請求ID(Request ID)
-?云區(qū)(Cloud Region)
-?環(huán)境變量(Environment Variables)
-?安全密鑰/令牌(Security keys/tokens)
-?運行時/bin路徑(Runtime/Bin paths)
-?日志(Log )
-?數(shù)據(jù)綁定(Data binding)
一些實現(xiàn)使用日志對象初始化日志對象(例如肠槽,作為AWS中的全局變量或Azure中的部分上下文)擎淤,用戶可以使用集成平臺工具跟蹤函數(shù)執(zhí)行奢啥。除了傳統(tǒng)的日志記錄之外,未來的實現(xiàn)可能會將計數(shù)器/監(jiān)視和跟蹤活動抽象為平臺上下文的一部分嘴拢,以進(jìn)一步提高功能的可用性桩盲。
數(shù)據(jù)綁定作為函數(shù)上下文的一部分,平臺根據(jù)用戶配置啟動到外部數(shù)據(jù)資源的連接席吴,這些連接可以在多個函數(shù)調(diào)用中重用赌结。
函數(shù)輸出(Function Output)
當(dāng)函數(shù)退出時捞蛋,它可以:
-?向調(diào)用者返回一個值(例如,在HTTP請求/響應(yīng)示例中)
-?將結(jié)果傳遞到工作流中的下一個執(zhí)行階段
-?將輸出寫入日志
應(yīng)該有一種確定的方法來知道函數(shù)是否通過返回的錯誤值或退出代碼成功或失敗柬姚。
函數(shù)輸出可以是結(jié)構(gòu)化的(如HTTP響應(yīng)對象)或非結(jié)構(gòu)化的(如某些輸出字符串)拟杉。
無服務(wù)器函數(shù)工作流(Serverless Function Workflow)
在無服務(wù)器域中,用例(Use Case)屬于以下類別之一:
-?一個事件觸發(fā)一個函數(shù)
-?事件的和/或組合觸發(fā)一個函數(shù)
-?一個事件觸發(fā)順序或并行執(zhí)行的多個函數(shù)
-?函數(shù)的結(jié)果可能是另一個函數(shù)的觸發(fā)器
-?n個事件(i n和/或)觸發(fā)m個函數(shù)量承,即事件函數(shù)交錯的工作流搬设,如事件1觸發(fā)函數(shù)1,完成函數(shù)1和事件2以及事件3觸發(fā)函數(shù)2撕捍,然后函數(shù)2的不同結(jié)果觸發(fā)分支到函數(shù)3或函數(shù)4拿穴。
用戶需要一種方法來指定他們的無服務(wù)器用例或工作流。例如忧风,一個用例可以是“在照片上傳到云存儲時在照片上進(jìn)行人臉識別(發(fā)生照片存儲事件)默色。”另一個物聯(lián)網(wǎng)用例可以是“在接收到運動檢測事件時進(jìn)行運動分析”狮腿,然后根據(jù)分析功能的結(jié)果腿宰,或者“觸發(fā)房屋警報并調(diào)用e警察部門“或只是”將運動圖像發(fā)送給房主≡迪幔“有關(guān)詳細(xì)信息酗失,請參閱用例部分。
AWS提供“步驟函數(shù)”(step function)昧绣,供用戶指定其工作流规肴,但步驟函數(shù)不允許指定觸發(fā)工作流中哪些函數(shù)的事件/事件。
下圖是涉及事件和函數(shù)的用戶工作流的示例夜畴。使用這種函數(shù)圖拖刃,用戶可以輕松地指定事件和函數(shù)之間的交互,以及如何在工作流中的函數(shù)之間傳遞信息贪绘。
?功能圖狀態(tài)包括:
- Event State(事件狀態(tài)):此狀態(tài)允許等待來自事件源的事件兑牡,然后觸發(fā)函數(shù)運行或多個函數(shù)按順序、并行或在分支中運行税灌。
- Operation/Task State(操作/任務(wù)狀態(tài)):此狀態(tài)允許按順序或并行運行一個或多個函數(shù)均函,而不等待任何事件。
-?Switch/Choice State(切換/選擇狀態(tài)):此狀態(tài)允許轉(zhuǎn)換到多個其他狀態(tài)(例如菱涤,前一個函數(shù)結(jié)果觸發(fā)分支/轉(zhuǎn)換到不同的下一個狀態(tài))苞也。
-?End/Stop State(結(jié)束/停止?fàn)顟B(tài)):此狀態(tài)以失敗/成功終止工作流。
-?Pass State(通過狀態(tài)):此狀態(tài)在兩個狀態(tài)之間插入事件數(shù)據(jù)粘秆。
-?Delay/Wait State(延遲/等待狀態(tài)):此狀態(tài)導(dǎo)致工作流執(zhí)行延遲指定的持續(xù)時間或直到指定的時間/日期如迟。
狀態(tài)和相關(guān)信息需要保存在一些持久存儲中,以便進(jìn)行故障恢復(fù)。在某些用例中殷勘,用戶可能希望將來自一個狀態(tài)的信息傳遞到下一個狀態(tài)此再。這些信息可以是函數(shù)執(zhí)行結(jié)果的一部分,也可以是與事件觸發(fā)器關(guān)聯(lián)的輸入數(shù)據(jù)的一部分玲销。需要在每個狀態(tài)定義一個信息過濾器输拇,以過濾出需要在狀態(tài)之間傳遞的信息。
參考
-?CNCF Serverless Whitepaper v1.0?