本文介紹了無服務(wù)器技術(shù),并將其與PaaS和SpaaS進行了對比,同時介紹了無服務(wù)器體系結(jié)構(gòu)的收益和成本,還有框架方面的需求。
最開始,“無服務(wù)器”意在幫助開發(fā)者擺脫運行后端應(yīng)用程序所需的服務(wù)器設(shè)備的設(shè)置和管理工作。這項技術(shù)的目標并不是為了實現(xiàn)真正意義上的“無服務(wù)器”,而是指由第三方供應(yīng)商負責后端基礎(chǔ)結(jié)構(gòu)的維護,以服務(wù)的方式為開發(fā)者提供所需功能,例如數(shù)據(jù)庫、消息,以及身份驗證等。這種服務(wù)基礎(chǔ)結(jié)構(gòu)通??梢越凶龊蠖思捶?wù)(Backend-as-a-Service,BaaS),或移動后端即服務(wù)(Mobile Backend-as-a-service,MBaaS)。
但Amazon在2014年發(fā)布的AWS Lambda讓“無服務(wù)器”這一范式提高到一個全新的層面,為云中運行的應(yīng)用程序提供了一種全新的系統(tǒng)體系結(jié)構(gòu)。至此再也不需要在服務(wù)器上持續(xù)運行進程以等待HTTP請求或API調(diào)用,而是可以通過某種事件機制觸發(fā)代碼的執(zhí)行,通常這只需要在AWS的某臺服務(wù)器上運行一個簡單的功能。
使用這一范式的開發(fā)者無需考慮服務(wù)器細節(jié),只需要負責編寫發(fā)生某些事件后所需執(zhí)行的代碼。云供應(yīng)商將負責提供用于運行這些代碼的服務(wù)器,并在必要時對服務(wù)器進行縮放。執(zhí)行完畢后,承擔這些功能的容器會立刻停用,并且執(zhí)行過程以100毫秒為單位進行度量,用戶只需為運行代碼過程中所消耗的資源付費。一些人將這種模式叫做功能即服務(wù)(Function-as-a-Service,F(xiàn)aaS),另一種“即服務(wù)”(Yet-Another-as-a-Service,YassS),自從云計算技術(shù)登場后這樣的稱呼越來越多了。
Amazon并不是唯一的FaaS供應(yīng)商。其他廠商,例如Google Cloud Functions、Microsoft Azure Functions、IBM OpenWhisk,以及Iron.io和Webtask等各種開源實現(xiàn)都提供了類似的服務(wù)。
無服務(wù)器體系結(jié)構(gòu)很適合搭配NanoService使用。如果說微服務(wù)(MicroService)是為了提供相對小規(guī)模的業(yè)務(wù)能力,那么可以認為NanoService提供的是這種能力的碎片。例如,可以通過微服務(wù)代表為某個客戶執(zhí)行所有CRUD操作所需的代碼,而NanoService可以代表客戶所要執(zhí)行的每個操作:創(chuàng)建、讀取、更新,以及刪除。當觸發(fā)“創(chuàng)建帳戶”事件后,將通過AWS Lambda函數(shù)的方式執(zhí)行相應(yīng)的NanoService。但這種時候很少使用NanoService這樣的稱呼,大部分人更愿意將其稱為微服務(wù),或者就叫做“服務(wù)”。
一些人認為FaaS就是另一種形式的PaaS,但Intent Media的工程副總裁Mike Roberts有自己的不同看法:
大部分PaaS應(yīng)用無法針對每個請求啟動和停止整個應(yīng)用程序,而FaaS平臺生來就是為了實現(xiàn)這樣的目的。…
FaaS和PaaS在運維方面最大的差異在于縮放能力。對于大部分PaaS平臺,用戶依然需要考慮縮放,例如在使用Heroku時需要考慮到底需要運行幾個Dyno。但是對于FaaS應(yīng)用,這種問題完全是透明的。就算將PaaS應(yīng)用設(shè)置為自動縮放,依然無法在具體請求的層面上進行縮放(除非提供非常具體的流量塑形配置文件),而FaaS應(yīng)用在成本方面效益就高多了。
Roberts并不認為大家都需要拋棄PaaS轉(zhuǎn)為擁抱FaaS,原因有幾個:“工具,以及API網(wǎng)關(guān)的完善程度可能是最大的問題。此外PaaS中實施的12-Factor Apps可能會使用應(yīng)用內(nèi)只讀緩存以優(yōu)化性能,這種情況就不適合使用FaaS功能。”
自稱為資深思想家和“話癆”的Camille Fournier發(fā)布了一條推文質(zhì)疑說:“如果無服務(wù)器服務(wù)將成為類似存儲過程那樣的重要概念,一個本來挺好的想法可能很快就會產(chǎn)生大量技術(shù)債。”作為對這個問題的回應(yīng),Roberts認為,只有在無服務(wù)器功能僅僅是“一小段用于對數(shù)據(jù)庫的訪問進行封裝(Wrap)”的情況下,F(xiàn)aaS才能稱之為SpaaS(Stored-Procedures-as-a-Services,存儲過程即服務(wù))。但FaaS的功能還可以用于其他很多用途,因此不適合這樣進行類比。Roberts同時還補充說,與存儲過程不同,無服務(wù)器的功能不依賴具體的語言或框架供應(yīng)商,可以輕松實現(xiàn)測試和版本控制等功能。
談到無服務(wù)器體系結(jié)構(gòu),ThoughtWorks公司的開發(fā)者Badri Janakiraman補充了FaaS導(dǎo)致的一種變革:長久以來,用于包含大部分邏輯的服務(wù)器流程可以拆解為大量專有的,以及第三方服務(wù),同時對應(yīng)用程序的控制轉(zhuǎn)移到了客戶端:
無服務(wù)器應(yīng)用程序通常需要借助大量第三方服務(wù)實現(xiàn)原本由自己的服務(wù)器所承擔的任務(wù)。這些服務(wù)相互交織組成了豐富的服務(wù)生態(tài)系統(tǒng),例如Amazon AWS和Azure,或者也可以通過“大包大攬”的方式通過一個服務(wù)提供一系列能力,例如Parse或Firebase。這些服務(wù)所提供的抽象可以是基礎(chǔ)結(jié)構(gòu)層面的(例如消息隊列、數(shù)據(jù)庫、邊緣緩存…),也可能是高級別的(例如聯(lián)合身份、角色和能力管理、搜索…)。
對于常規(guī)用途的基于服務(wù)器的Web應(yīng)用程序,其主要職責之一在于控制請求響應(yīng)周期。服務(wù)器端的控制程序負責處理輸入,引用相應(yīng)的應(yīng)用程序行為,構(gòu)建動態(tài)的響應(yīng),這一過程通常需要使用模板化的引擎。在無服務(wù)器應(yīng)用程序中,應(yīng)用程序的行為與第三方服務(wù)交織在一起,客戶端的控制流和動態(tài)的內(nèi)容生成取代了服務(wù)器端的控制程序。富JavaScript應(yīng)用程序、移動應(yīng)用(以及越來越多的電視機或嵌入式物聯(lián)網(wǎng)應(yīng)用)通過調(diào)用API并使用客戶端UI框架生成動態(tài)內(nèi)容,借此對不同服務(wù)之間的交付進行協(xié)調(diào)。
對于實施無服務(wù)器應(yīng)用程序所能獲得的收益,Janakiraman認為包括:成本大幅降低,開發(fā)者不需要為云中運行的整個服務(wù)器付費,只需要為執(zhí)行代碼過程中消耗的資源付費;可縮放能力,可以通過事件觸發(fā)的方式輕松地對不同服務(wù)進行縮放,而無須考慮基礎(chǔ)結(jié)構(gòu)的運維和維護。在成本方面Janakiraman認為“將一個應(yīng)用程序拆分為相互交織的不同服務(wù),觀念上的負擔會非常大,所用服務(wù)的種類越多這種負擔就會越大”,并且開發(fā)測試工作的復(fù)雜度會增加。
使用無服務(wù)器方法通過FaaS創(chuàng)建整個后端系統(tǒng)時還有一項隱含成本,serverless.com在自己的文檔中談到了這個問題:
雖然AWS Lambda提供了強大的應(yīng)用程序開發(fā)/運行新方法,但在完全基于AWS Lambda開發(fā)首個項目時我們意識到自己急需一種新的結(jié)構(gòu)。對Lambda所引入的所有容器進行管理這是一項困難的任務(wù)。對于包含多名開發(fā)者、多種階段,或需要為多個區(qū)域提供支持的團隊,很快就會開始變得手忙腳亂。
為此Serverless Inc.制訂了Serverless Framework,希望借助這個開源項目幫助開發(fā)者通過FaaS順利構(gòu)建Web、移動,以及物聯(lián)網(wǎng)應(yīng)用程序。該框架目前可適用于AWS Lambda,但框架的創(chuàng)建者預(yù)計未來還將支持其他供應(yīng)商。這個框架提供了多種功能,包括在本地或遠程運行和測試Lambda函數(shù),部署Lambda函數(shù),將REST API部署至AWS API網(wǎng)關(guān),部署Lambda事件,為多個AWS地區(qū)提供支持等。目前可支持的語言包括JavaScript/Node.js,對Python和Java的支持正在開發(fā)中,稍后可能還會增加對其他語言的支持。
其他無服務(wù)器框架還包括Apex,該框架具備類似的功能,可支持JavaScript/Node.js、Go、Java和Python,未來還計劃支持其他供應(yīng)商。
對于希望進一步了解無服務(wù)器體系結(jié)構(gòu)的人,amazon.com的CTO Werner Vogels發(fā)布了一系列使用AWS Lambda構(gòu)建應(yīng)用程序的參考體系結(jié)構(gòu)。他還提供了各種指南,幫助開發(fā)者創(chuàng)建移動后端、實時文件處理能力、Web應(yīng)用程序、物聯(lián)網(wǎng)后端,以及基于Kinesis的實時流處理能力。這些參考體系結(jié)構(gòu)中體現(xiàn)的基本原則也適用于其他FaaS供應(yīng)商,不過具體使用到的服務(wù)可能會有所變化。