二进制函数_SERVERLESS函数小解
本文介紹當(dāng)前serverless框架的函數(shù)概念,Serverless框架還允許用戶監(jiān)視代碼存儲(chǔ)庫中的更改(例如代碼觸發(fā)器等),并在每次提交時(shí)自動(dòng)構(gòu)建函數(shù)鏡像。函數(shù)代碼、依賴項(xiàng)和/或二進(jìn)制文件可以駐留在外部存儲(chǔ)庫(例如S3對象存儲(chǔ)桶或Git存儲(chǔ)庫)中,或由用戶直接提供。如果代碼在外部存儲(chǔ)庫中,則用戶需要指定路徑和接入憑證。函數(shù)可能依賴于外部庫或二進(jìn)制文件,這些需要由用戶提供,包括描述其構(gòu)建過程的方式(例如,使用 Dockerfile、Zip等)。另外,可以通過一些二進(jìn)制打包(例如OCI鏡像)將函數(shù)提供給框架。
接下來讓我們介紹一下serverless函數(shù)概念。
一、函數(shù)定義
函數(shù)代碼、依賴項(xiàng)或二進(jìn)制文件可以駐留在外部存儲(chǔ)庫(例如S3對象存儲(chǔ)桶或Git存儲(chǔ)庫)中,或由用戶直接提供。如果代碼在外部存儲(chǔ)庫中,則用戶需要指定路徑和憑據(jù)。Serverless 框架還允許用戶 watch 代碼存儲(chǔ)庫中的更改(例如,使 Webhook),并在每次提交時(shí)自動(dòng)構(gòu)建函數(shù)鏡像/二進(jìn)制文件。函數(shù)可能依賴于外部庫或二進(jìn)制文件,這些需要由用戶提供,包括描述其構(gòu)建過程的方式(例如,使用 Dockerfile、Zip)。另外,可以通過一些二進(jìn)制打包(例如OCI鏡像)將函數(shù)提供給框架。
函數(shù)定義
Serverless 函數(shù)定義可能包含以下規(guī)范和元數(shù)據(jù),該函數(shù)定義:
- 唯一ID
- 名稱
- 說明
- Label(或tag)
- 版本ID/或版本別名
- 版本創(chuàng)建時(shí)間
- 上次修改時(shí)間(函數(shù)定義)
- 函數(shù)處理程序
- 運(yùn)行時(shí)語言
- 代碼 + 依賴關(guān)系或代碼路徑和憑據(jù)
- 環(huán)境變量
- 執(zhí)行角色和密鑰
- 資源(所需的 CPU、內(nèi)存)
- 執(zhí)行超時(shí)處理
- 日志記錄失敗(Dead Letter Queue,)
- 網(wǎng)絡(luò)策略/VPC
- 數(shù)據(jù)綁定
- 網(wǎng)關(guān)接入等
二、元數(shù)據(jù)
函數(shù)框架可能包括以下函數(shù)元數(shù)據(jù):
- 版本:每個(gè)函數(shù)版本應(yīng)具有唯一的標(biāo)識符,此外,可以使用一個(gè)或多個(gè)別名(例如“l(fā)atest”、“production”、“beta”)來標(biāo)記版本。API 網(wǎng)關(guān)和事件源會(huì)將流
量/事件路由到特定的函數(shù)版本。 - 環(huán)境變量:用戶可以指定在運(yùn)行時(shí)將提供給函數(shù)的環(huán)境變量。環(huán)境變量也可以從機(jī)密和加密的內(nèi)容派生,也可以從平臺變量派生(例如,像Kubernetes EnvVar定
義)。環(huán)境變量使開發(fā)人員能夠控制函數(shù)行為和參數(shù),而無需修改代碼和/或重建函數(shù),從而獲得更好的開發(fā)人員體驗(yàn)和函數(shù)重用。 - 執(zhí)行角色:該函數(shù)應(yīng)在特定的用戶或角色身份下運(yùn)行,以授予和審核其對平臺資源的訪問權(quán)限。
- 資源:定義所需或最大的硬件資源,例如函數(shù)使用的內(nèi)存和CPU。
- 超時(shí):指定函數(shù)調(diào)用在平臺終止之前可以運(yùn)行的最長時(shí)間。
- 故障日志(死信隊(duì)列):隊(duì)列或流的路徑,它將存儲(chǔ)具有適當(dāng)詳細(xì)信息的失敗函數(shù)執(zhí)行列表。
- 網(wǎng)絡(luò)策略:分配給函數(shù)的網(wǎng)絡(luò)域和策略(函數(shù)與外部服務(wù)/資源進(jìn)行通信)。
- 執(zhí)行語義:指定應(yīng)如何執(zhí)行函數(shù)(例如,每個(gè)事件至少執(zhí)行一次,最多執(zhí)行一次,恰好一次)。
三、數(shù)據(jù)綁定
某些 Serverless 框架允許用戶指定函數(shù)使用的輸入/輸出數(shù)據(jù)資源,這使開發(fā)變得更簡單,性能更高(在執(zhí)行期間保留數(shù)據(jù)連接,可以預(yù)取數(shù)據(jù)等)以及更好的安全
性(數(shù)據(jù)資源憑據(jù)是上下文的一部分,而不是代碼)。
綁定數(shù)據(jù)可以采用文件、對象、記錄、消息等形式,函數(shù)說明可以包括一組數(shù)據(jù)綁定定義,每個(gè)定義都指定數(shù)據(jù)資源、其憑證和使用參數(shù)。數(shù)據(jù)綁定可以引用事件數(shù)據(jù)
(例如,DB 鍵是從事件 “username” 字段派生的)
四、函數(shù)輸入
函數(shù)輸入包括事件數(shù)據(jù)和元數(shù)據(jù),并且可以包括上下文對象。
事件數(shù)據(jù)和元數(shù)據(jù)
事件詳細(xì)信息應(yīng)傳遞給函數(shù)處理程序,不同的事件可能具有不同的元數(shù)據(jù),因此希望函數(shù)能夠確定事件的類型并輕松解析公共和特定于事件的元數(shù)據(jù)。
可能需要將事件類與實(shí)現(xiàn)分離,例如:不管流存儲(chǔ)是 Kafka 還是 Kinesis,處理消息流的函數(shù)都可以運(yùn)行。在這兩種情況下,它將接收消息正文和事件元數(shù)據(jù),消
息可能在不同框架之間路由。
事件可以包括單個(gè)記錄(例如,在請求/響應(yīng)模型中),也可以接受多個(gè)記錄或微批處理(例如,在流模式中)。
FaaS 解決方案使用的常見事件數(shù)據(jù)和元數(shù)據(jù)的示例:
- Event Class/Kind
- 版本
- 事件 ID
- Event Source/Origin
- 來源身份
- 內(nèi)容類型
- 郵件正文
- 時(shí)間戳記
事件/記錄特定元數(shù)據(jù)的示例
- HTTP:Path、Method、Header、查詢參數(shù)
- 消息隊(duì)列:Topic、Header
- 記錄流(Record Stream):表、鍵、操作、修改時(shí)間、舊字段、新字段
事件源結(jié)構(gòu)的示例:
- http://docs.aws.amazon.com/lambda/latest/dg/eventsources.html
- https://docs.microsoft.com/zh-cn/azure/azure-functions/functions-triggers-bindings
- https://cloud.google.com/functions/docs/concepts/events-triggers
一些實(shí)現(xiàn)將 JSON 視為將事件信息傳遞給函數(shù)的機(jī)制。對于高速函數(shù)(例如,流處理)或低能耗設(shè)備(IoT),這可能會(huì)增加大量的序列化/反序列化開銷。在這些情況
下,可能值得考慮使用本地語言結(jié)構(gòu)或其他序列化機(jī)制。
五、函數(shù)上下文
調(diào)用函數(shù)時(shí),框架可能希望提供對跨多個(gè)函數(shù)調(diào)用的平臺資源或常規(guī)屬性的訪問,而不是將所有靜態(tài)數(shù)據(jù)放入事件中或強(qiáng)制該函數(shù)在每次調(diào)用時(shí)初始化平臺服務(wù)。上下文(Context)可以是一組輸入屬性、環(huán)境變量或全局變量。有的實(shí)現(xiàn)將這三者結(jié)合使用。
上下文示例:
- 函數(shù)名稱、版本、ARN
- 內(nèi)存限制
- 請求 ID
- Cloud Region
- 環(huán)境變量
- 安全密鑰/令牌
- 運(yùn)行時(shí)/綁定路徑
- 日志
- 數(shù)據(jù)綁定
有的實(shí)現(xiàn)初始化日志對象(例如, AWS 中的全局變量或 Azure 中的部分上下文),用戶可以使用平臺集成的工具查看日志來跟蹤函數(shù)執(zhí)行。除了傳統(tǒng)的日志記錄,未來的實(shí)現(xiàn)可能會(huì)將計(jì)數(shù)器/監(jiān)控和跟蹤活動(dòng)抽象為平臺上下文的一部分,以進(jìn)一步提高函數(shù)的可用性。數(shù)據(jù)綁定是函數(shù)上下文的一部分,平臺根據(jù)用戶配置啟動(dòng)與外部數(shù)據(jù)資源的連接,并且這些連接可以在多個(gè)函數(shù)調(diào)用之間重用。
五、函數(shù)輸出
當(dāng)函數(shù)退出時(shí),它可能:
- 將值返回給調(diào)用方(例如,在 HTTP 請求/響應(yīng)示例中)
- 將結(jié)果傳遞到工作流程中的下一個(gè)執(zhí)行階段
- 將輸出寫入日志
應(yīng)該有確定的方式通過返回的錯(cuò)誤值或退出代碼來知道函數(shù)是成功還是失敗。
函數(shù)輸出可以是結(jié)構(gòu)化的(例如 HTTP 響應(yīng)對象)或非結(jié)構(gòu)化的(例如某些輸出字符串)。
參考資料
1. function
2. Serverless函數(shù)小解
End
樂于輸出干貨的CloudNative相關(guān)技術(shù)公眾號:DCOS。
總結(jié)
以上是生活随笔為你收集整理的二进制函数_SERVERLESS函数小解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运维分级发布_华为杨超斌发布面向“1+N
- 下一篇: itemchanged信号找不到_失物