【转】无服务计算(Serverless Computing)核心知识
Serverless Computing概念
????云原生計(jì)算基金會(huì)CNCF(Cloud Native Computing Foundation, CNCF)Serverless Whitepaper v1.0對(duì)無(wú)服務(wù)器計(jì)算作了如下定義:
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ú)服務(wù)器計(jì)算(Serverless Computing)是指在構(gòu)建和運(yùn)行應(yīng)用時(shí)無(wú)需管理服務(wù)器等基礎(chǔ)設(shè)施。它描述了一個(gè)更細(xì)粒度的部署模型,在該模型中,應(yīng)用被拆解為一個(gè)或多個(gè)細(xì)粒度的函數(shù)被上傳到一個(gè)平臺(tái),然后根據(jù)當(dāng)前所需執(zhí)行、擴(kuò)展和計(jì)費(fèi)。
????無(wú)服務(wù)器計(jì)算并不意味著我們不再使用服務(wù)器來(lái)承載和運(yùn)行代碼,也不意味著不再需要運(yùn)維工程師。而是指無(wú)服務(wù)器計(jì)算的消費(fèi)者不再需要花費(fèi)時(shí)間和資源在服務(wù)器配置、維護(hù)、更新、擴(kuò)展和容量規(guī)劃上。所有這些任務(wù)和功能都由無(wú)服務(wù)器平臺(tái)處理,并且完全從開(kāi)發(fā)人員和IT/操作團(tuán)隊(duì)中抽象出來(lái)。因此,開(kāi)發(fā)人員專(zhuān)注于編寫(xiě)應(yīng)用程序的業(yè)務(wù)邏輯。運(yùn)營(yíng)工程師能夠?qū)⑺麄兊闹攸c(diǎn)提升到更關(guān)鍵的業(yè)務(wù)任務(wù)上。?
?
FaaS & BaaS
無(wú)服務(wù)器計(jì)算平臺(tái)可以提供以下一種或兩種服務(wù):
1. FaaS(Functions-as-a-Service-函數(shù)即服務(wù)),通常提供事件驅(qū)動(dòng)(event-driving)的計(jì)算。開(kāi)發(fā)人員使用由事件(event)或HTTP請(qǐng)求觸發(fā)的函數(shù)運(yùn)行和管理應(yīng)用程序代碼。開(kāi)發(fā)人員將小的代碼單元部署到FaaS,FaaS按需執(zhí)行和擴(kuò)展,開(kāi)發(fā)人員無(wú)需管理服務(wù)器或任何其他底層基礎(chǔ)設(shè)施。
2. Baas(Backend-as-a-Service后端即服務(wù)),是第三方基于API的服務(wù),用于替換自有應(yīng)用程序中的功能子集。因?yàn)檫@些API是作為一個(gè)自動(dòng)擴(kuò)縮容和透明操作的服務(wù)提供的,所以開(kāi)發(fā)人員認(rèn)為這(BaaS)是無(wú)服務(wù)器的 ,如:OSS
?
Pros & Cons
無(wú)服務(wù)器計(jì)算(Serverless Computing)應(yīng)用利弊大致如下:
Pros:
1. 0服務(wù)器操作。無(wú)服務(wù)器通過(guò)消除維護(hù)服務(wù)器資源所涉及的開(kāi)銷(xiāo),極大地改變了運(yùn)行軟件應(yīng)用程序的成本模型。
2. 沒(méi)有配置、更新和管理服務(wù)器基礎(chǔ)結(jié)構(gòu)。
3. 彈性伸縮:無(wú)服務(wù)器FaaS或BaaS產(chǎn)品可以立即精確地伸縮以處理每個(gè)單獨(dú)的傳入請(qǐng)求。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),無(wú)服務(wù)器平臺(tái)沒(méi)有“預(yù)先計(jì)劃的容量”的概念,也不需要配置“自動(dòng)伸縮”觸發(fā)器或規(guī)則。在沒(méi)有開(kāi)發(fā)人員干預(yù)的情況下,自動(dòng)進(jìn)行縮放。在完成請(qǐng)求處理后,無(wú)服務(wù)器FaaS會(huì)自動(dòng)縮小計(jì)算資源的規(guī)模,以確保永遠(yuǎn)沒(méi)有空閑的容量。
4. 低成本。無(wú)服務(wù)器計(jì)算服務(wù)對(duì)空閑的虛擬機(jī)或容器不收費(fèi);也就是說(shuō)當(dāng)代碼沒(méi)有運(yùn)行或沒(méi)有進(jìn)行有意義的工作時(shí),不收費(fèi)。?
Cons:
1. 作為一種新興的計(jì)算模型、缺乏標(biāo)準(zhǔn)化和生態(tài)系統(tǒng)成熟度。
2. 由于運(yùn)行時(shí)更具動(dòng)態(tài)性,與iaas和paas相比,調(diào)試可能更具挑戰(zhàn)性。
3. 由于按需結(jié)構(gòu),如果運(yùn)行時(shí)在空閑時(shí)刪除函數(shù)的所有實(shí)例,則某些無(wú)服務(wù)器運(yùn)行時(shí)的“冷啟動(dòng)”方面可能是性能問(wèn)題。
4. 在更復(fù)雜的情況下(例如,觸發(fā)其他功能的功能),對(duì)于相同數(shù)量的邏輯,可以有更多的操作表面積。
?
Serverless處理模型(Serverless Processing Model)
CNCF白皮書(shū)對(duì)于無(wú)服務(wù)器框架中的函數(shù)用法,函數(shù)約束、生命周期、調(diào)用類(lèi)型和所需的抽象等定義了規(guī)范,以便同一個(gè)函數(shù)可以一次性編碼,并在不同的無(wú)服務(wù)器框架中使用。?
?
FaaS解決方案概括為具有以下圖中所示的幾個(gè)關(guān)鍵元素:
1. 事件源(Event sources)-觸發(fā)器或流事件到一個(gè)或多個(gè)函數(shù)實(shí)例中
2. 函數(shù)實(shí)例(Function instances)-單個(gè)函數(shù)/微服務(wù),可根據(jù)需求進(jìn)行擴(kuò)展
3. FaaS控制器(FaaS Controller)-部署、控制和監(jiān)視函數(shù)實(shí)例及其源
4. 平臺(tái)服務(wù)(Platform services?)-FaaS解決方案使用的通用集群或云服務(wù)(有時(shí)稱(chēng)為后端即服務(wù)-BaaS)
?
CNCF函數(shù)相關(guān)規(guī)范
函數(shù)定義(Function Definition)
無(wú)服務(wù)器函數(shù)定義可以包含以下規(guī)范和元數(shù)據(jù),函數(shù)定義是特定于版本的:
1. 唯一ID
2. 名字
3. 描述
4. 標(biāo)簽
5. 版本ID(和/或版本別名)
6. 版本創(chuàng)建時(shí)間
7. 上次修改時(shí)間(函數(shù)定義的)
8. 函數(shù)處理程序
9. 運(yùn)行時(shí)語(yǔ)言
10. 代碼+依賴(lài)項(xiàng)或代碼路徑和憑據(jù)
11. 環(huán)境變量
12. 執(zhí)行角色和密鑰
13. 資源(所需的CPU、內(nèi)存)
14. 執(zhí)行超時(shí)時(shí)間
15. 日志失敗(死信隊(duì)列)
16. 網(wǎng)絡(luò)策略/vpc
17. 數(shù)據(jù)綁定(Metadata Binding)
元數(shù)據(jù)詳細(xì)信息(Metadata details)
1. 版本(Version)-每個(gè)函數(shù)版本都應(yīng)該有一個(gè)唯一的標(biāo)識(shí)符,此外,可以使用一個(gè)或多個(gè)別名(例如“最新”、“生產(chǎn)”、“測(cè)試版”)標(biāo)記版本。API網(wǎng)關(guān)和事件源將流量/事件路由到特定的函數(shù)版本。
2. 環(huán)境變量(Environment Variables)-用戶(hù)可以指定將在運(yùn)行時(shí)提供給函數(shù)的環(huán)境變量。環(huán)境變量也可以從機(jī)密和加密內(nèi)容派生,或者從平臺(tái)變量派生(例如,kubernetes envvar定義)。環(huán)境變量使開(kāi)發(fā)人員能夠控制函數(shù)行為和參數(shù),而無(wú)需修改代碼和/或重建函數(shù),從而獲得更好的開(kāi)發(fā)人員體驗(yàn)和函數(shù)重用。
3. 執(zhí)行角色(Execution Role)-該函數(shù)應(yīng)在特定的用戶(hù)或角色標(biāo)識(shí)下運(yùn)行,該標(biāo)識(shí)授予并審核其對(duì)平臺(tái)資源的訪問(wèn)權(quán)限。
4. 資源(Resources)-定義功能所需的或最大的硬件資源,如內(nèi)存和CPU。
5. 超時(shí)(Timeout)-指定函數(shù)調(diào)用在被平臺(tái)終止之前可以運(yùn)行的最長(zhǎng)時(shí)間。
6. 失敗日志(死信隊(duì)列)(Failure Log (Dead Letter Queue))-隊(duì)列或流的路徑,用于存儲(chǔ)失敗的函數(shù)執(zhí)行列表,并提供適當(dāng)?shù)脑敿?xì)信息。
7. 網(wǎng)絡(luò)策略(Network Policy)-分配給功能的網(wǎng)絡(luò)域和策略(用于與外部服務(wù)/資源通信的功能)。
8. 執(zhí)行語(yǔ)義(Execution Semantics)-指定應(yīng)如何執(zhí)行函數(shù)(例如,每個(gè)事件至少執(zhí)行一次、至多執(zhí)行一次、完全執(zhí)行一次)。
數(shù)據(jù)綁定(Data Bindings)
????一些無(wú)服務(wù)器框架允許用戶(hù)指定函數(shù)使用的輸入/輸出數(shù)據(jù)資源,這使開(kāi)發(fā)人員能夠簡(jiǎn)化、提高性能(在執(zhí)行之間保留數(shù)據(jù)連接,可以預(yù)取數(shù)據(jù)等)和更好的安全性(數(shù)據(jù)資源憑據(jù)是上下文的一部分,而不是代碼)。
????綁定數(shù)據(jù)可以是文件、對(duì)象、記錄、消息等形式,函數(shù)規(guī)范可以包括一組數(shù)據(jù)綁定定義,每個(gè)定義指定數(shù)據(jù)資源、其憑證和使用參數(shù)。數(shù)據(jù)綁定可以引用事件數(shù)據(jù)(例如,db鍵是從事件“用戶(hù)名”字段派生的),示例:https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings
?
函數(shù)約束(Function Requirements)
函數(shù)和無(wú)服務(wù)器運(yùn)行時(shí)應(yīng)該滿(mǎn)足的通用需求:
1. 函數(shù)必須與不同事件類(lèi)的基礎(chǔ)實(shí)現(xiàn)分離
2. 可以從多個(gè)事件源調(diào)用函數(shù)
3. 每個(gè)調(diào)用方法不需要不同的函數(shù)
4. 事件源可以調(diào)用多個(gè)函數(shù)
5. 函數(shù)可能需要與底層平臺(tái)服務(wù)進(jìn)行持久綁定的機(jī)制,這可能是跨函數(shù)調(diào)用。函數(shù)可能是短暫的,但如果需要在每次調(diào)用(例如在日志記錄、連接和裝載外部數(shù)據(jù)源的情況下)上都進(jìn)行引導(dǎo),則引導(dǎo)可能會(huì)很昂貴。
6. 每個(gè)函數(shù)可以用不同于同一應(yīng)用程序中使用的其他函數(shù)的代碼語(yǔ)言編寫(xiě)。
7. 函數(shù)運(yùn)行時(shí)應(yīng)盡可能減少事件序列化和反序列化開(kāi)銷(xiāo)(例如,使用本機(jī)語(yǔ)言結(jié)構(gòu)或有效的編碼方案)
?
函數(shù)調(diào)用類(lèi)型(Function Invocation Types)
根據(jù)不同的用例,可以從不同的事件源調(diào)用函數(shù),例如:
1. 同步請(qǐng)求(Synchronous Request (Req/Rep)),例如http請(qǐng)求、grpc調(diào)用
????- 客戶(hù)機(jī)發(fā)出請(qǐng)求并等待立即響應(yīng)。這是一個(gè)阻塞呼叫。
2. 異步消息隊(duì)列請(qǐng)求(pub/sub)(Asynchronous Message Queue Request),例如RabbitMQ, AWS SNS, MQTT, Email, Object (S3) change、計(jì)劃事件(如cron作業(yè))
????- 消息發(fā)布到交換并分發(fā)到訂閱服務(wù)器
? ? - 沒(méi)有嚴(yán)格的消息順序, 可一次處理
3. 消息/記錄流(Message/Record Streams):Kafka, AWS Kinesis, AWS DynamoDB Streams, Database CDC
? ? - 一組有序的消息/記錄(必須按順序處理)
? ? - 通常,一個(gè)流被分割到多個(gè)分區(qū)/碎片(partitions/shards?),每個(gè)碎片有一個(gè)worker(碎片使用者)
? ? - 流可以從消息、數(shù)據(jù)庫(kù)更新(日志)或文件(例如csv、json、parquet)生成。
? ? - 事件可以推送到函數(shù)運(yùn)行時(shí),也可以由函數(shù)運(yùn)行時(shí)拉取。
4. 批處理作業(yè)(Batch Jobs),例如ETL作業(yè)、分布式深度學(xué)習(xí)、HPC模擬
? ? - 作業(yè)(Jobs)被調(diào)度或提交到隊(duì)列,并在運(yùn)行時(shí)使用多個(gè)并行函數(shù)實(shí)例進(jìn)行處理,每個(gè)實(shí)例處理工作集(任務(wù))的一個(gè)或多個(gè)部分。
? ? - 當(dāng)所有并行工作人員成功完成所有計(jì)算任務(wù)時(shí),作業(yè)完成。
?
?
函數(shù)生命周期(Function LifeCycle)
函數(shù)部署管道(Function Deployment Pipeline)
?
函數(shù)生命周期:
1. 編寫(xiě)代碼、提供規(guī)范和元數(shù)據(jù)
2. 獲取代碼和規(guī)范,編譯并將其轉(zhuǎn)化為一個(gè)工件(二進(jìn)制代碼、包或容器鏡像)
3. 工件部署到一個(gè)集群上,控制器實(shí)體負(fù)責(zé)根據(jù)事件流量和/或?qū)嵗系呢?fù)載調(diào)整函數(shù)實(shí)例的數(shù)量。
?
函數(shù)操作(Function Operations)
無(wú)服務(wù)器框架可能允許以下操作和方法定義和控制功能生命周期:
1. 創(chuàng)建(Create)-創(chuàng)建一個(gè)新函數(shù),包括其規(guī)范和代碼
2. 發(fā)布(Publish)-創(chuàng)建可部署在群集上的函數(shù)的新版本
3. 更新別名/標(biāo)簽(Update Alias/Label [of a version])-更新版本別名
4. 執(zhí)行/調(diào)用(Execute/Invoke)-不通過(guò)事件源調(diào)用特定版本
5. 事件源關(guān)聯(lián)(Event Source association?)-將函數(shù)的特定版本連接到事件源
6. 獲取(Get)-返回函數(shù)元數(shù)據(jù)和規(guī)范
7. 更新(Update)-修改函數(shù)的最新版本
8. 刪除(Delete)-刪除一個(gè)函數(shù),可以刪除一個(gè)特定的版本或函數(shù)的所有版本
9. 清單(List)-顯示函數(shù)及其元數(shù)據(jù)的列表
10. 狀態(tài)獲取(get stats)-返回有關(guān)函數(shù)運(yùn)行時(shí)使用情況的統(tǒng)計(jì)信息
11. 日志獲取(get logs)-返回函數(shù)生成的日志
?
關(guān)鍵步驟說(shuō)明:
1. Create:在創(chuàng)建函數(shù)時(shí),提供其元數(shù)據(jù)(稍后在函數(shù)規(guī)范中描述)作為函數(shù)創(chuàng)建的一部分,將對(duì)其進(jìn)行編譯并可能發(fā)布。稍后可以啟動(dòng)、禁用和啟用功能。功能部署需要能夠支持以下用例:
????- 事件流(Event streaming),在這種情況下,隊(duì)列中可能總是有事件,但是可能需要通過(guò)顯式請(qǐng)求暫停/恢復(fù)處理。
? ? - 熱啟動(dòng)(Warm startup)-在任何時(shí)候具有最少實(shí)例數(shù)的函數(shù),例如,接收到的“第一個(gè)”事件具有熱啟動(dòng),因?yàn)樵摵瘮?shù)已經(jīng)部署并準(zhǔn)備好服務(wù)于該事件(而不是在“傳入”事件第一次調(diào)用時(shí)部署該函數(shù)的冷啟動(dòng))。
2. Publish:用戶(hù)可以發(fā)布一個(gè)函數(shù),這將創(chuàng)建一個(gè)新版本(最新版本的副本),發(fā)布的版本可能會(huì)被標(biāo)記/標(biāo)記或有別名,請(qǐng)參閱下面的詳細(xì)信息。
3. 用戶(hù)可能希望為調(diào)試和開(kāi)發(fā)過(guò)程直接執(zhí)行/調(diào)用函數(shù)(繞過(guò)事件源或API網(wǎng)關(guān))。用戶(hù)可以指定調(diào)用參數(shù),如所需版本、同步/異步操作、詳細(xì)級(jí)別等。
4. 用戶(hù)可能希望獲得函數(shù)統(tǒng)計(jì)信息(例如調(diào)用次數(shù)、平均運(yùn)行時(shí)間、平均延遲、失敗、重試次數(shù)等),統(tǒng)計(jì)信息可以是當(dāng)前度量值或一系列值(例如存儲(chǔ)在Prometheus或云提供程序設(shè)施(如AWS Cloud Watch))。
5. 用戶(hù)可能希望檢索函數(shù)日志數(shù)據(jù)。這可以根據(jù)嚴(yán)重性級(jí)別和/或時(shí)間范圍和/或內(nèi)容進(jìn)行篩選。日志數(shù)據(jù)是每個(gè)函數(shù)的,它包括諸如函數(shù)創(chuàng)建和刪除、顯式錯(cuò)誤、警告或調(diào)試消息等事件,還可以選擇函數(shù)的stdout或stderr。每次調(diào)用最好有一個(gè)日志條目,或者一種將日志條目與特定調(diào)用關(guān)聯(lián)的方法(以便更簡(jiǎn)單地跟蹤函數(shù)執(zhí)行流)。
?
事件源(Event Source)
不同類(lèi)型的事件源包括:
1. 事件和消息服務(wù),例如:?RabbitMQ, MQTT, SES, SNS, Google Pub/Sub
2. 存儲(chǔ)服務(wù),例如:S3, DynamoDB, Kinesis, Cognito, Google Cloud Storage, Azure Blob, iguazio V3IO (object/stream/DB)
3. 端點(diǎn)服務(wù),例如:物聯(lián)網(wǎng)(IoT)、HTTP網(wǎng)關(guān)(HTTP Gateway)、移動(dòng)設(shè)備、Alexa、Google Cloud Endpoints
4. 配置存儲(chǔ)庫(kù),例如:Git, CodeCommit
5. 使用特定于語(yǔ)言的sdk的用戶(hù)應(yīng)用程序
6. 定時(shí)事件-允許定期調(diào)用函數(shù)。
?
事件源到函數(shù)的關(guān)聯(lián)(Event Source to Function Association)
函數(shù)是由事件源觸發(fā)的事件調(diào)用的。函數(shù)和事件源之間有一個(gè)n:m映射。每個(gè)事件源可以用來(lái)調(diào)用多個(gè)函數(shù),一個(gè)函數(shù)可以由多個(gè)事件源觸發(fā)。事件源可以映射到函數(shù)的特定版本或函數(shù)的別名,后者提供了更改函數(shù)的方法,并部署了一個(gè)新版本,而不需要更改事件關(guān)聯(lián)。事件源也可以定義為使用同一函數(shù)的不同版本,定義應(yīng)為每個(gè)函數(shù)分配多少流量。
在創(chuàng)建了一個(gè)函數(shù)之后,或者在以后的某個(gè)時(shí)間點(diǎn),需要將事件源關(guān)聯(lián)起來(lái),該事件源應(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),并且可以包括一個(gè)上下文對(duì)象(context object)。
?
事件數(shù)據(jù)和元數(shù)據(jù)(Event data and metadata)
事件詳細(xì)信息應(yīng)傳遞給函數(shù)處理程序,不同的事件可能具有不同的元數(shù)據(jù),因此函數(shù)需要能夠確定事件的類(lèi)型并輕松解析通用和特定于事件的元數(shù)據(jù)。
將事件類(lèi)與實(shí)現(xiàn)分離是可取的,例如:處理消息流的函數(shù)將工作相同,而不管流存儲(chǔ)是Kafka還是Kinesis。在這兩種情況下,它都將接收消息體和事件元數(shù)據(jù),消息可以在不同的框架之間路由。
事件可以包括單個(gè)記錄(例如,在請(qǐng)求/響應(yīng)模型中),或者接受多個(gè)記錄或微批(例如,在流模式中)。
FaaS解決方案使用的常見(jiàn)事件數(shù)據(jù)和元數(shù)據(jù)示例:
- 事件類(lèi)別
-?版本
-?事件ID
-?事件來(lái)源/來(lái)源
-?源識(shí)別
-?內(nèi)容類(lèi)型
-?消息體
-?時(shí)間戳
事件/記錄特定元數(shù)據(jù)的示例:
-?HTTP: 路徑、方法、頭、查詢(xún)參數(shù)
-?Message Queue:消息隊(duì)列:主題,標(biāo)題
-?記錄流(Record Stream):表、鍵、op、修改時(shí)間、舊字段、新字段
事件源結(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
有些實(shí)現(xiàn)將JSON作為向函數(shù)傳遞事件信息的機(jī)制來(lái)關(guān)注。這可能會(huì)增加高速函數(shù)(例如流處理)或低能耗設(shè)備(IOT)的大量序列化/反序列化開(kāi)銷(xiāo)。在這些情況下,將本機(jī)語(yǔ)言結(jié)構(gòu)或其他序列化機(jī)制視為選項(xiàng)可能是值得的。
?
函數(shù)上下文(Function Context)
當(dāng)調(diào)用函數(shù)時(shí),框架可能希望提供對(duì)跨多個(gè)函數(shù)調(diào)用的平臺(tái)資源或常規(guī)屬性的訪問(wèn),而不是將所有靜態(tài)數(shù)據(jù)放在事件中,或強(qiáng)制函數(shù)在每次調(diào)用時(shí)初始化平臺(tái)服務(wù)。
上下文作為一組輸入屬性、環(huán)境變量或全局變量傳遞。有些實(shí)現(xiàn)使用這三種方法的組合。
上下文示例:
-?函數(shù)名、版本、ARN
-?存儲(chǔ)限制(Memory Limit)
-?請(qǐng)求ID(Request ID)
-?云區(qū)(Cloud Region)
-?環(huán)境變量(Environment Variables)
-?安全密鑰/令牌(Security keys/tokens)
-?運(yùn)行時(shí)/bin路徑(Runtime/Bin paths)
-?日志(Log )
-?數(shù)據(jù)綁定(Data binding)
一些實(shí)現(xiàn)使用日志對(duì)象初始化日志對(duì)象(例如,作為AWS中的全局變量或Azure中的部分上下文),用戶(hù)可以使用集成平臺(tái)工具跟蹤函數(shù)執(zhí)行。除了傳統(tǒng)的日志記錄之外,未來(lái)的實(shí)現(xiàn)可能會(huì)將計(jì)數(shù)器/監(jiān)視和跟蹤活動(dòng)抽象為平臺(tái)上下文的一部分,以進(jìn)一步提高功能的可用性。
數(shù)據(jù)綁定作為函數(shù)上下文的一部分,平臺(tái)根據(jù)用戶(hù)配置啟動(dòng)到外部數(shù)據(jù)資源的連接,這些連接可以在多個(gè)函數(shù)調(diào)用中重用。
?
函數(shù)輸出(Function Output)
當(dāng)函數(shù)退出時(shí),它可以:
-?向調(diào)用者返回一個(gè)值(例如,在HTTP請(qǐng)求/響應(yīng)示例中)
-?將結(jié)果傳遞到工作流中的下一個(gè)執(zhí)行階段
-?將輸出寫(xiě)入日志
應(yīng)該有一種確定的方法來(lái)知道函數(shù)是否通過(guò)返回的錯(cuò)誤值或退出代碼成功或失敗。
函數(shù)輸出可以是結(jié)構(gòu)化的(如HTTP響應(yīng)對(duì)象)或非結(jié)構(gòu)化的(如某些輸出字符串)。
?
無(wú)服務(wù)器函數(shù)工作流(Serverless Function Workflow)
在無(wú)服務(wù)器域中,用例(Use Case)屬于以下類(lèi)別之一:
-?一個(gè)事件觸發(fā)一個(gè)函數(shù)
-?事件的和/或組合觸發(fā)一個(gè)函數(shù)
-?一個(gè)事件觸發(fā)順序或并行執(zhí)行的多個(gè)函數(shù)
-?函數(shù)的結(jié)果可能是另一個(gè)函數(shù)的觸發(fā)器
-?n個(gè)事件(i n和/或)觸發(fā)m個(gè)函數(shù),即事件函數(shù)交錯(cuò)的工作流,如事件1觸發(fā)函數(shù)1,完成函數(shù)1和事件2以及事件3觸發(fā)函數(shù)2,然后函數(shù)2的不同結(jié)果觸發(fā)分支到函數(shù)3或函數(shù)4。
用戶(hù)需要一種方法來(lái)指定他們的無(wú)服務(wù)器用例或工作流。例如,一個(gè)用例可以是“在照片上傳到云存儲(chǔ)時(shí)在照片上進(jìn)行人臉識(shí)別(發(fā)生照片存儲(chǔ)事件)。”另一個(gè)物聯(lián)網(wǎng)用例可以是“在接收到運(yùn)動(dòng)檢測(cè)事件時(shí)進(jìn)行運(yùn)動(dòng)分析”,然后根據(jù)分析功能的結(jié)果,或者“觸發(fā)房屋警報(bào)并調(diào)用e警察部門(mén)“或只是”將運(yùn)動(dòng)圖像發(fā)送給房主。“有關(guān)詳細(xì)信息,請(qǐng)參閱用例部分。
AWS提供“步驟函數(shù)”(step function),供用戶(hù)指定其工作流,但步驟函數(shù)不允許指定觸發(fā)工作流中哪些函數(shù)的事件/事件。
下圖是涉及事件和函數(shù)的用戶(hù)工作流的示例。使用這種函數(shù)圖,用戶(hù)可以輕松地指定事件和函數(shù)之間的交互,以及如何在工作流中的函數(shù)之間傳遞信息。
?
?功能圖狀態(tài)包括:
- Event State(事件狀態(tài)):此狀態(tài)允許等待來(lái)自事件源的事件,然后觸發(fā)函數(shù)運(yùn)行或多個(gè)函數(shù)按順序、并行或在分支中運(yùn)行。
- Operation/Task State(操作/任務(wù)狀態(tài)):此狀態(tài)允許按順序或并行運(yùn)行一個(gè)或多個(gè)函數(shù),而不等待任何事件。
-?Switch/Choice State(切換/選擇狀態(tài)):此狀態(tài)允許轉(zhuǎn)換到多個(gè)其他狀態(tài)(例如,前一個(gè)函數(shù)結(jié)果觸發(fā)分支/轉(zhuǎn)換到不同的下一個(gè)狀態(tài))。
-?End/Stop State(結(jié)束/停止?fàn)顟B(tài)):此狀態(tài)以失敗/成功終止工作流。
-?Pass State(通過(guò)狀態(tài)):此狀態(tài)在兩個(gè)狀態(tài)之間插入事件數(shù)據(jù)。
-?Delay/Wait State(延遲/等待狀態(tài)):此狀態(tài)導(dǎo)致工作流執(zhí)行延遲指定的持續(xù)時(shí)間或直到指定的時(shí)間/日期。
狀態(tài)和相關(guān)信息需要保存在一些持久存儲(chǔ)中,以便進(jìn)行故障恢復(fù)。在某些用例中,用戶(hù)可能希望將來(lái)自一個(gè)狀態(tài)的信息傳遞到下一個(gè)狀態(tài)。這些信息可以是函數(shù)執(zhí)行結(jié)果的一部分,也可以是與事件觸發(fā)器關(guān)聯(lián)的輸入數(shù)據(jù)的一部分。需要在每個(gè)狀態(tài)定義一個(gè)信息過(guò)濾器,以過(guò)濾出需要在狀態(tài)之間傳遞的信息。
?
參考
-?CNCF Serverless Whitepaper v1.0?
-?CNCF Serverless WG
-?An I&O Leader’s Guide to Serverless Computing
-?Guide to Serverless Technologies
作者:杰客大叔
鏈接:https://www.jianshu.com/p/aa07e656b83d
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的【转】无服务计算(Serverless Computing)核心知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 几月份买银行理财划算?年底理财产品会涨吗
- 下一篇: 信用卡积分可以兑换现金吗