云計(jì)算的核心理念是資源復(fù)用和靈活調(diào)度,從物理機(jī)發(fā)展到虛擬機(jī)到容器,都是資源粒度不斷細(xì)化、管理調(diào)度不斷優(yōu)化的過(guò)程,2014年AWS推出Lambda云服務(wù),其提出的函數(shù)計(jì)算為核心的Serverless架構(gòu)(無(wú)服務(wù)器架構(gòu))更加體現(xiàn)了這一理念。隨后各個(gè)云計(jì)算提供商紛紛推出函數(shù)計(jì)算云服務(wù),例如微軟推出Azure Function,2017年4月,阿里云推出Function Compute,騰訊云推出無(wú)服務(wù)器云函數(shù)。函數(shù)計(jì)算從2017年開(kāi)始以大熱姿態(tài)占據(jù)云計(jì)算領(lǐng)域的視野,成為2017年增長(zhǎng)最快的云服務(wù)[1]。
函數(shù)計(jì)算是一種云服務(wù)運(yùn)行環(huán)境,開(kāi)發(fā)者不再需要預(yù)配置與管理后端服務(wù)器,只需要聚焦核心業(yè)務(wù),為應(yīng)用編寫(xiě)一段代碼,將代碼上傳至函數(shù)計(jì)算云服務(wù)中,函數(shù)計(jì)算服務(wù)會(huì)根據(jù)代碼運(yùn)行情況自動(dòng)進(jìn)行彈性伸縮,靈活擴(kuò)展,代碼運(yùn)行結(jié)束,函數(shù)計(jì)算會(huì)自動(dòng)釋放云資源。對(duì)用戶而言,無(wú)需關(guān)心基礎(chǔ)設(shè)施層的構(gòu)建與維護(hù),提高服務(wù)部署效率。函數(shù)計(jì)算按需使用按需付費(fèi),大幅降低成本。業(yè)界認(rèn)為,使用函數(shù)計(jì)算,云的費(fèi)用可減少10%至90%[2]。有研究報(bào)告指出,函數(shù)計(jì)算的市場(chǎng)規(guī)模將從2016年的18.8億美元增長(zhǎng)至2021年的77.2億美元,復(fù)合年增長(zhǎng)率為32.7%[3]。
因此,需要對(duì)函數(shù)計(jì)算業(yè)界標(biāo)桿及工作原理進(jìn)行研究,并且對(duì)函數(shù)計(jì)算的特點(diǎn)及應(yīng)用場(chǎng)景進(jìn)行分析,才能將函數(shù)計(jì)算運(yùn)用在最合適的業(yè)務(wù)與應(yīng)用中,最大程度地提高云資源使用效率與減少成本費(fèi)用。
AWS Lambda可以為任何類型的應(yīng)用程序或后端服務(wù)運(yùn)行代碼,開(kāi)發(fā)者無(wú)需預(yù)配置或管理服務(wù)器。AWS Lambda按需執(zhí)行代碼并自動(dòng)縮放,如圖1所示。
圖1 AWS Lambda原理示意圖
AWS Lambda的主要由事件源、事件源映射、函數(shù)計(jì)算三部分組成。事件源指發(fā)布事件的云服務(wù)或者自定義程序。函數(shù)指處理事件的自定義代碼。事件源映射把事件源與函數(shù)關(guān)聯(lián)起來(lái),當(dāng)事件發(fā)生時(shí)自動(dòng)觸發(fā)相應(yīng)函數(shù)。事件源可以來(lái)自AWS服務(wù)或者自定義應(yīng)用程序,來(lái)自AWS服務(wù)事件源分為非基于流的事件源與基于流的事件源[4],如表1所示。
表1 AWS Lambda支持的事件源
AWS Lambda的應(yīng)用場(chǎng)景主要有數(shù)據(jù)處理與后端兩大塊。數(shù)據(jù)處理包括實(shí)時(shí)文件處理、實(shí)時(shí)數(shù)據(jù)流處理與提取、轉(zhuǎn)換、加載。實(shí)時(shí)文件處理例如上傳數(shù)據(jù)到S3,觸發(fā)Lambda進(jìn)行創(chuàng)建圖片處理、視頻處理、文件處理、日志處理以及收集與處理數(shù)據(jù);實(shí)時(shí)數(shù)據(jù)流處理例如使用Kinesis接收實(shí)時(shí)數(shù)據(jù)流,觸發(fā)Lambda進(jìn)行監(jiān)控應(yīng)用程序、整理與分析數(shù)據(jù)、生成指標(biāo)、處理日志、以及接收處理IoT 數(shù)據(jù);提取、轉(zhuǎn)換、加載例如DynamoDB的數(shù)據(jù)變化觸發(fā)Lambda進(jìn)行篩選、排序等處理,并把轉(zhuǎn)換的數(shù)據(jù)加載至存儲(chǔ)桶。用Lambda構(gòu)建后端包括IoT后端、移動(dòng)后端、Web后端與第三方API請(qǐng)求,用以構(gòu)建個(gè)性化、強(qiáng)大的應(yīng)用程序,而同時(shí)開(kāi)發(fā)者不需要再關(guān)注可擴(kuò)展性與冗余備份的工作。
開(kāi)發(fā)者編寫(xiě)應(yīng)用和服務(wù),并上傳至函數(shù)計(jì)算中,函數(shù)觸發(fā)運(yùn)行,按需動(dòng)態(tài)擴(kuò)容,按量計(jì)費(fèi),如圖2所示。
圖2 阿里云函數(shù)計(jì)算原理示意圖
阿里云函數(shù)計(jì)算由四大主要元素組成:服務(wù)、函數(shù)、事件以及觸發(fā)器。使用函數(shù)計(jì)算時(shí),首先,在服務(wù)內(nèi)創(chuàng)建函數(shù),服務(wù)是函數(shù)計(jì)算的最小單位,但每個(gè)服務(wù)有規(guī)定最大函數(shù)運(yùn)行數(shù)量,當(dāng)應(yīng)用比較復(fù)雜時(shí),可分解為多個(gè)服務(wù),以微服務(wù)形式構(gòu)建。第二,創(chuàng)建函數(shù),把應(yīng)用部署到函數(shù)中。第三,配置觸發(fā)器,觸發(fā)器統(tǒng)一管理各個(gè)事件源。當(dāng)事件源中有事件發(fā)生時(shí),如果滿足觸發(fā)器定義的規(guī)則時(shí),事件觸發(fā)函數(shù)運(yùn)行。事件源可以是對(duì)象存儲(chǔ) OSS,日志服務(wù),API 網(wǎng)關(guān),定時(shí)器(Timer)和 HTTP 請(qǐng)求等。在觸發(fā)器中可配置事件觸發(fā)函數(shù)的方式。阿里云函數(shù)計(jì)算支持兩種觸發(fā)器,如表2所示。最后,查看執(zhí)行日志與服務(wù)監(jiān)控。
表2 阿里云函數(shù)計(jì)算支持的觸發(fā)器
阿里云函數(shù)計(jì)算的應(yīng)用場(chǎng)景包括事件請(qǐng)求、流量突發(fā)和大數(shù)據(jù)處理。事件請(qǐng)求場(chǎng)景包括圖片與事件定制、物聯(lián)網(wǎng)中的低頻請(qǐng)求、計(jì)劃事件觸發(fā)。
Azure Function主要由觸發(fā)器、函數(shù)計(jì)算與綁定(輸入與輸出)三個(gè)元素構(gòu)成,如圖3所示。
圖3 Azure Function原理示意圖
在Azure中,觸發(fā)器定義函數(shù)運(yùn)行的觸發(fā)方式。輸入與輸出綁定是提供Azure Function連接到其他服務(wù)的聲明性方式,可以省去對(duì)Azure Function需要使用到的服務(wù)詳細(xì)信息進(jìn)行硬編碼,有利于Azure Function與其他服務(wù)進(jìn)行關(guān)聯(lián)與集成。每個(gè)函數(shù)有且只有一個(gè)觸發(fā)器,每個(gè)函數(shù)可以綁定多個(gè)輸入和多個(gè)輸出。觸發(fā)器是必須具備的,綁定輸入輸出則是可選的。
Azure Function的觸發(fā)器與輸入輸出綁定支持如表3所示[5]:
表3 Azure Function支持的觸發(fā)器與綁定(輸入與輸出)
注:帶星號(hào)的表示試驗(yàn)性,不受支持,未來(lái)可能被棄用。
Azure Function的縮放和托管分為兩種模式,一種是應(yīng)用服務(wù)模式,一種是消耗量模式。在使用Azure Function之前需要選定縮放和托管模式。應(yīng)用服務(wù)模式為傳統(tǒng)云計(jì)算的資源管理模式,需預(yù)配置處理能力,消耗量模式為無(wú)服務(wù)架構(gòu)模式,系統(tǒng)自動(dòng)縮放自動(dòng)彈性分配資源。應(yīng)用服務(wù)模式在專用VM上運(yùn)行,當(dāng)運(yùn)行時(shí)間超過(guò)允許函數(shù)執(zhí)行的最長(zhǎng)時(shí)間(10分鐘)或預(yù)期函數(shù)會(huì)接近持續(xù)運(yùn)行,采用應(yīng)用服務(wù)模式會(huì)更節(jié)省成本與提高效率。
Azure Function的應(yīng)用場(chǎng)景,包括Web應(yīng)用程序后端,移動(dòng)應(yīng)用程序后端,實(shí)時(shí)文件處理,實(shí)時(shí)流失處理,計(jì)劃任務(wù)的自動(dòng)化,擴(kuò)展SaaS應(yīng)用程序等。
騰訊云無(wú)服務(wù)器云函數(shù)主要由事件源與函數(shù)計(jì)算兩個(gè)核心組件組成,如圖4所示。
圖4 騰訊云無(wú)服務(wù)器云函數(shù)原理示意圖
騰訊云無(wú)服務(wù)器云函數(shù)也是事件驅(qū)動(dòng)特征,事件源產(chǎn)生事件,去觸發(fā)云函數(shù)處理事件,而觸發(fā)器則是維護(hù)事件源與函數(shù)的對(duì)應(yīng)與關(guān)聯(lián)關(guān)系。云函數(shù)的事件源可以是騰訊云自身的云服務(wù),也可以是用戶自定義程序,如表4所示。
表4 騰訊云無(wú)服務(wù)器云函數(shù)支持的事件源
騰訊云無(wú)服務(wù)器云函數(shù)的應(yīng)用場(chǎng)景,包括API 服務(wù)、文件處理及通知、消息轉(zhuǎn)存、業(yè)務(wù)流轉(zhuǎn)、AI 推理。
函數(shù)計(jì)算是一種事件驅(qū)動(dòng)型服務(wù),通過(guò)上一章節(jié)的業(yè)界標(biāo)桿分析,可以歸納出,函數(shù)計(jì)算服務(wù)的原理抽象出來(lái),一般包含事件源,函數(shù)計(jì)算以及定義與管理事件源如何觸發(fā)函數(shù)計(jì)算的規(guī)則,如圖5所示。
開(kāi)發(fā)者編寫(xiě)函數(shù)代碼上傳至函數(shù)計(jì)算,以及配置好函數(shù)觸發(fā)規(guī)則。當(dāng)事件源有事件發(fā)生時(shí),便會(huì)按照配置好的函數(shù)觸發(fā)規(guī)則自動(dòng)觸發(fā)函數(shù),函數(shù)計(jì)算會(huì)根據(jù)業(yè)務(wù)運(yùn)行的波峰波谷情況,自動(dòng)進(jìn)行彈性伸縮。
圖5 業(yè)界標(biāo)桿函數(shù)計(jì)算原理示意圖
觸發(fā)規(guī)則管理根據(jù)事件源類型或各個(gè)云提供商的規(guī)定放在函數(shù)計(jì)算或放在事件源內(nèi)。每個(gè)云計(jì)算提供商的函數(shù)計(jì)算都有會(huì)規(guī)定允許觸發(fā)函數(shù)計(jì)算的事件源/觸發(fā)器,梳理為如表5所示。
表5 業(yè)界標(biāo)桿函數(shù)計(jì)算事件源歸納表
從表5可以看出,四家業(yè)界標(biāo)桿函數(shù)計(jì)算的事件源均支持網(wǎng)絡(luò)與內(nèi)容分發(fā)、存儲(chǔ)、數(shù)據(jù)分析與定時(shí)事件,其中3家標(biāo)桿函數(shù)計(jì)算均支持的事件源覆蓋IoT、數(shù)據(jù)庫(kù)、消息隊(duì)列等集成服務(wù), AWS Lambda與騰訊云無(wú)服務(wù)器云函數(shù)均支持用戶自定義事件源。AWS lambda支持的事件源最多,還支持管理與機(jī)器學(xué)習(xí)事件源。
從上述標(biāo)桿分析也可看出,4家標(biāo)桿函數(shù)計(jì)算的應(yīng)用場(chǎng)景均涵蓋實(shí)時(shí)數(shù)據(jù)處理與后端服務(wù)等。
無(wú)服務(wù)架構(gòu)下的函數(shù)計(jì)算啟動(dòng)主要與容器啟動(dòng)策略有關(guān)。開(kāi)發(fā)者首先需要把自定義代碼上傳至云存儲(chǔ)里,當(dāng)事件源發(fā)布事件時(shí),代碼包從云存儲(chǔ)中下載到函數(shù)計(jì)算運(yùn)行環(huán)境中,按需觸發(fā)。函數(shù)計(jì)算啟動(dòng)流程如圖6所示。
圖6 函數(shù)計(jì)算啟動(dòng)示意圖
函數(shù)被事件觸發(fā)時(shí),函數(shù)計(jì)算根據(jù)開(kāi)發(fā)者的設(shè)置啟動(dòng)容器(即執(zhí)行環(huán)境)。容器的創(chuàng)建和刪除操作直接由函數(shù)計(jì)算管理,并沒(méi)有開(kāi)放給開(kāi)發(fā)者。函數(shù)代碼執(zhí)行后,函數(shù)計(jì)算會(huì)凍結(jié)容器至少數(shù)分鐘,預(yù)期用于另一次函數(shù)調(diào)用。如果函數(shù)計(jì)算服務(wù)在再次調(diào)用函數(shù)時(shí)選擇重用容器,則解凍容器供重用,即使用Warm容器,Warm容器中會(huì)保持用戶代碼的一些初始化狀態(tài)可以直接重用,例如一些數(shù)據(jù)庫(kù)連接等,所以使用Warm容器會(huì)獲得更快的代碼運(yùn)行時(shí)間,延遲小,節(jié)省成本。但函數(shù)計(jì)算并非始終重用容器,可能會(huì)根據(jù)策略或其他因素僅創(chuàng)建新容器而非重用現(xiàn)有容器,即使用Cold容器。
傳統(tǒng)的云計(jì)算也能進(jìn)行靈活的彈性伸縮,那么使用函數(shù)計(jì)算的架構(gòu)與傳統(tǒng)云計(jì)算相比有什么區(qū)別和優(yōu)勢(shì)呢?在傳統(tǒng)云計(jì)算中,開(kāi)發(fā)者除了需要編寫(xiě)應(yīng)用的代碼外,還需要管理云主機(jī)、操作系統(tǒng)接入控制及補(bǔ)丁,還需關(guān)心CPU數(shù)量、內(nèi)存大小、IP地址等[6];為應(yīng)對(duì)業(yè)務(wù)量的波峰波谷變化,還必須提前預(yù)配置彈性伸縮負(fù)載均衡等策略。而為了節(jié)省成本以及資源配置最優(yōu)化,開(kāi)發(fā)者或運(yùn)維人員必須在業(yè)務(wù)運(yùn)行過(guò)程中根據(jù)實(shí)際情況不斷調(diào)整彈性伸縮負(fù)載均衡等策略,以避免閑時(shí)資源太多。這個(gè)過(guò)程耗費(fèi)大量人力成本與時(shí)間成本,而資源配置卻未必能時(shí)刻達(dá)到最優(yōu)。而使用函數(shù)計(jì)算后,開(kāi)發(fā)者只需要編寫(xiě)應(yīng)用代碼上傳至函數(shù)計(jì)算,一旦有事件源發(fā)布,函數(shù)計(jì)算便會(huì)自動(dòng)觸發(fā),根據(jù)代碼自動(dòng)按需對(duì)底層資源進(jìn)行彈性伸縮靈活擴(kuò)展,底層資源的彈性擴(kuò)展對(duì)開(kāi)發(fā)者來(lái)說(shuō)是屏蔽的,縮減了開(kāi)發(fā)者大量運(yùn)維工作,大幅降低人力成本與時(shí)間成本。當(dāng)函數(shù)運(yùn)行完畢時(shí),所使用的云資源會(huì)自動(dòng)釋放,不存在閑時(shí)資源,對(duì)開(kāi)發(fā)者而言降低應(yīng)用擴(kuò)展成本,對(duì)云提供商而言,削峰填谷,提高云資源利用率,可以賣出更多的云資源。
適合使用函數(shù)計(jì)算的業(yè)務(wù)與應(yīng)用都可以通過(guò)函數(shù)計(jì)算較好地解決成本、效率、聯(lián)通問(wèn)題。這些業(yè)務(wù)與應(yīng)用一般具有以下特點(diǎn),第一,業(yè)務(wù)具有波峰波谷變化。第二,業(yè)務(wù)運(yùn)行具有事件觸發(fā)特征。第三,應(yīng)用需要關(guān)聯(lián)多種云服務(wù)。第四,應(yīng)用數(shù)據(jù)更新大,一臺(tái)服務(wù)器的處理能力已不能滿足,開(kāi)發(fā)者需要考慮如何配置負(fù)載均衡來(lái)應(yīng)對(duì)處理請(qǐng)求。第五,應(yīng)用版本迭代速度快,業(yè)務(wù)開(kāi)發(fā)、部署、升級(jí)、擴(kuò)容要求高[7]。第六,一些低頻的、維護(hù)性的后臺(tái)任務(wù)等。
然而,函數(shù)計(jì)算的特點(diǎn)使其并不適合所有的應(yīng)用,第一,若業(yè)務(wù)波峰波谷不明顯,則使用函數(shù)計(jì)算并不能大幅節(jié)約成本,因?yàn)闊o(wú)法體現(xiàn)函數(shù)計(jì)算自動(dòng)伸縮按需使用按需付費(fèi)的優(yōu)勢(shì)。第二,耦合性強(qiáng)的業(yè)務(wù)不適合使用函數(shù)計(jì)算。因?yàn)楹瘮?shù)計(jì)算如果使用本地狀態(tài),會(huì)有很多嚴(yán)格限制,需要假設(shè)任何進(jìn)程間或者主機(jī)狀態(tài)對(duì)子進(jìn)程都不可見(jiàn),包括RAM和寫(xiě)到本地盤上的狀態(tài),從一個(gè)部署單元看,函數(shù)計(jì)算是無(wú)狀態(tài)的。這一點(diǎn)對(duì)應(yīng)用架構(gòu)影響很大。第三,一些大型應(yīng)用程序不容易拆分搬上函數(shù)計(jì)算架構(gòu)。因?yàn)楹瘮?shù)計(jì)算一般會(huì)限制每個(gè)函數(shù)允許運(yùn)行多長(zhǎng)時(shí)間[7],如果超出就被強(qiáng)行退出,例如目前AWS Lambda函數(shù)允許最多運(yùn)行5分鐘,Azure Function是10分鐘。某些長(zhǎng)時(shí)間運(yùn)行的任務(wù)如果轉(zhuǎn)到函數(shù)計(jì)算架構(gòu),就需要重新設(shè)計(jì),需要多創(chuàng)建幾個(gè)不同函數(shù)協(xié)調(diào)器。而在傳統(tǒng)架構(gòu)中,只需有一個(gè)就可以。第四,函數(shù)計(jì)算的冷熱容器啟動(dòng)策略,會(huì)造成應(yīng)用啟動(dòng)延遲10 ms到2分鐘[8],不適合對(duì)延時(shí)要求比較高的業(yè)務(wù)[9],最好進(jìn)行場(chǎng)景測(cè)試。對(duì)延時(shí)要求比較高的業(yè)務(wù),建議采用容器架構(gòu)比較合適[10]。
根據(jù)上述應(yīng)用特點(diǎn)分析,適合函數(shù)計(jì)算的典型應(yīng)用場(chǎng)景主要有四大類,第一,事件觸發(fā)類場(chǎng)景,例如定制圖片,定制事件,IoT中的低頻請(qǐng)求,音頻轉(zhuǎn)換文字處理,自動(dòng)程序消息傳遞,基于定時(shí)器處理/定時(shí)器任務(wù),日志處理,SaaS事件處理,批量任務(wù)。第二,流量突發(fā)類場(chǎng)景[11],例如彈性擴(kuò)展應(yīng)對(duì)突發(fā)流量,轉(zhuǎn)碼和流量擴(kuò)容,多媒體(視頻、圖片等)數(shù)據(jù)備份,圖片上傳、裁剪、分享等。處理大數(shù)據(jù)類場(chǎng)景,例如數(shù)據(jù)驅(qū)動(dòng)后續(xù)分發(fā),實(shí)時(shí)文件處理,實(shí)時(shí)數(shù)據(jù)流處理,數(shù)據(jù)庫(kù)數(shù)據(jù)提取、轉(zhuǎn)換、加載。第四,后端類場(chǎng)景,例如Web應(yīng)用程序、IoT后端、移動(dòng)后端、人工觸發(fā)。
云計(jì)算成為基礎(chǔ)設(shè)施已是共識(shí),運(yùn)營(yíng)商在近幾年的云計(jì)算布局中也占了一席之地,而函數(shù)計(jì)算對(duì)云提供商與用戶是一種具有雙贏價(jià)值的云服務(wù),因此運(yùn)營(yíng)商可考慮將函數(shù)計(jì)算作為開(kāi)拓云計(jì)算新市場(chǎng)和鞏固舊市場(chǎng)的戰(zhàn)略部署。
在函數(shù)計(jì)算功能規(guī)劃上,可參照業(yè)界標(biāo)桿設(shè)計(jì)為事件源、函數(shù)計(jì)算與觸發(fā)函數(shù)規(guī)則三部分組成。函數(shù)計(jì)算是事件驅(qū)動(dòng)型服務(wù),因此事件源的支持種類也很重要,可選取至少三家業(yè)界標(biāo)桿均支持的事件源作為第一階段實(shí)現(xiàn)目標(biāo),包括IoT、網(wǎng)絡(luò)與內(nèi)容分發(fā)、存儲(chǔ)、數(shù)據(jù)庫(kù)、定時(shí)事件;機(jī)器學(xué)習(xí)與自定義事件源等可作為遠(yuǎn)期目標(biāo)。
物聯(lián)網(wǎng)設(shè)備數(shù)量巨大及其所產(chǎn)生的數(shù)據(jù)量巨大,具有大量的數(shù)據(jù)收集與分析需求,且很多物聯(lián)網(wǎng)設(shè)備協(xié)議都是事件驅(qū)動(dòng),并且物聯(lián)網(wǎng)在邊緣上的應(yīng)用通常都是輕量級(jí),適合使用邏輯抽象粒度更小的函數(shù)計(jì)算進(jìn)行部署。而運(yùn)營(yíng)商在物聯(lián)網(wǎng)連接上有天然優(yōu)勢(shì),可以考慮將物聯(lián)網(wǎng)應(yīng)用場(chǎng)景作為函數(shù)計(jì)算的試點(diǎn)部署應(yīng)用場(chǎng)景,可以選擇一些對(duì)延時(shí)要求不高的低頻的物聯(lián)網(wǎng)應(yīng)用場(chǎng)景,例如智能抄表類、智能監(jiān)控類、智能廣告、物品跟蹤、建筑損耗、智慧養(yǎng)殖、金融POS、自動(dòng)售貨機(jī)等。
云計(jì)算發(fā)展的初始階段是基礎(chǔ)設(shè)施的云化,當(dāng)基礎(chǔ)設(shè)施云化到一定程度后,用戶便開(kāi)始尋求使用云計(jì)算的更省錢和更高效之道,更聚焦于業(yè)務(wù)層面的創(chuàng)新。本文對(duì)函數(shù)計(jì)算業(yè)界標(biāo)桿產(chǎn)品、工作原理、適合函數(shù)計(jì)算的應(yīng)用特點(diǎn)進(jìn)行研究,以及對(duì)函數(shù)計(jì)算典型應(yīng)用場(chǎng)景進(jìn)行梳理,有利于用戶更好的了解函數(shù)計(jì)算,在合適的應(yīng)用場(chǎng)景中匹配函數(shù)計(jì)算架構(gòu),發(fā)揮函數(shù)計(jì)算架構(gòu)節(jié)約成本、提高效率的巨大價(jià)值。