在過(guò)去的二十年中,IT領(lǐng)域的許多創(chuàng)新(例如,虛擬機(jī)、云計(jì)算、容器)一直致力于確保企業(yè)不必過(guò)多地考慮運(yùn)行代碼的底層物理機(jī)器。無(wú)服務(wù)器計(jì)算是一種越來(lái)越流行的模式,它將這種愿望用于其邏輯結(jié)論:使用無(wú)服務(wù)器計(jì)算,企業(yè)無(wú)需了解代碼運(yùn)行的硬件或操作系統(tǒng),因?yàn)榉?wù)提供商都會(huì)為企業(yè)提供服務(wù)。
什么是無(wú)服務(wù)器計(jì)算?
無(wú)服務(wù)器計(jì)算是云計(jì)算的一種執(zhí)行模型,云計(jì)算提供商在其中動(dòng)態(tài)分配,然后僅為執(zhí)行特定代碼片段所需的計(jì)算資源和存儲(chǔ)向用戶(hù)收費(fèi)。當(dāng)然,仍然涉及服務(wù)器,但它們的供應(yīng)和維護(hù)完全由提供商負(fù)責(zé)。亞馬遜的無(wú)服務(wù)器倡導(dǎo)者Chris Munns在2017年的一次會(huì)議上表示,“從團(tuán)隊(duì)編寫(xiě)和部署代碼的角度來(lái)看,根本沒(méi)有服務(wù)器可以管理或配置。這包括任何可能是裸機(jī)的東西,任何虛擬的東西,任何容器,任何涉及到管理主機(jī)、修補(bǔ)主機(jī)或在操作系統(tǒng)級(jí)別處理任何事情的東西,在無(wú)服務(wù)器的世界中都不是必須要做的事情。”
正如開(kāi)發(fā)人員Mike Roberts所解釋的那樣,該術(shù)語(yǔ)曾被用于所謂的“后端即服務(wù)”場(chǎng)景,其中移動(dòng)應(yīng)用程序?qū)⑦B接到完全托管在云中的后端服務(wù)器。但是目前,當(dāng)人們談?wù)摕o(wú)服務(wù)器計(jì)算或無(wú)服務(wù)器架構(gòu)時(shí),它們意味著是“功能即服務(wù)”產(chǎn)品,其中客戶(hù)編寫(xiě)的代碼只解決業(yè)務(wù)邏輯并將其上傳到提供商。該提供程序負(fù)責(zé)所有硬件配置、虛擬機(jī)和容器管理,甚至是多線程等通常內(nèi)置于應(yīng)用程序代碼中的任務(wù)。
無(wú)服務(wù)器功能是事件驅(qū)動(dòng)的,這意味著只有在請(qǐng)求觸發(fā)時(shí)才會(huì)調(diào)用代碼。提供商僅對(duì)該執(zhí)行所使用的計(jì)算時(shí)間收費(fèi),而不是維護(hù)物理服務(wù)器或虛擬服務(wù)器收取的每月固定費(fèi)用。這些功能可以連接在一起以創(chuàng)建處理管道,或者它們可以作為更大應(yīng)用程序的組件,與在容器中或在傳統(tǒng)服務(wù)器上運(yùn)行的其他代碼交互。
無(wú)服務(wù)器計(jì)算的優(yōu)點(diǎn)和缺點(diǎn)
從這個(gè)描述中,無(wú)服務(wù)器計(jì)算的兩個(gè)最大好處應(yīng)該是明確的:開(kāi)發(fā)人員可以關(guān)注他們編寫(xiě)的代碼的業(yè)務(wù)目標(biāo),而不是基礎(chǔ)設(shè)施問(wèn)題;組織只為他們實(shí)際使用的計(jì)算資源支付非常具體的費(fèi)用,而不是購(gòu)買(mǎi)物理硬件或租用大部分閑置的云計(jì)算實(shí)例。
正如行業(yè)專(zhuān)家Bernard Golden指出的那樣,這一點(diǎn)對(duì)事件驅(qū)動(dòng)的應(yīng)用程序特別有益。例如,企業(yè)可能有一個(gè)大部分時(shí)間處于空閑狀態(tài)的應(yīng)用程序,但在某些條件下必須同時(shí)處理許多事件請(qǐng)求。或者,企業(yè)可能擁有一個(gè)應(yīng)用程序來(lái)處理從有限性或間歇性全球互聯(lián)網(wǎng)連接的物聯(lián)網(wǎng)設(shè)備發(fā)送的數(shù)據(jù)。在這兩種情況下,傳統(tǒng)方法都需要配置一個(gè)能夠處理峰值工作能力的強(qiáng)大服務(wù)器,但是大多數(shù)時(shí)候服務(wù)器都未得到充分利用。使用無(wú)服務(wù)器架構(gòu),企業(yè)只需為實(shí)際使用的服務(wù)器資源付費(fèi)。無(wú)服務(wù)器計(jì)算也適用于特定類(lèi)型的批處理。無(wú)服務(wù)器架構(gòu)用例的規(guī)范示例之一是上載和處理一系列單個(gè)圖像文件,并將它們發(fā)送到應(yīng)用程序的另一部分的服務(wù)。
也許無(wú)服務(wù)器功能最明顯的缺點(diǎn)是,它們是短暫的,并不適合長(zhǎng)期任務(wù)。大多數(shù)無(wú)服務(wù)器提供商不會(huì)讓企業(yè)的代碼執(zhí)行超過(guò)幾分鐘,當(dāng)企業(yè)啟動(dòng)一個(gè)功能,它不會(huì)保留以前運(yùn)行的實(shí)例中的任何狀態(tài)數(shù)據(jù)。一個(gè)相關(guān)的問(wèn)題是,無(wú)服務(wù)器代碼可能需要幾秒鐘才能啟動(dòng),這對(duì)于許多用例而言不是問(wèn)題,但是如果企業(yè)的應(yīng)用程序需要低延遲,則需要發(fā)出警告。
正如Rohit Akiwatkar和Gary Arora所指出的,許多其他缺點(diǎn)都與供應(yīng)商鎖定有關(guān)。盡管有可用的開(kāi)源選項(xiàng),但無(wú)服務(wù)器市場(chǎng)由大型商業(yè)云計(jì)算提供商主導(dǎo),這將在稍后討論。這意味著開(kāi)發(fā)人員通常最終會(huì)使用其供應(yīng)商提供的工具,這使得如果他們變得不滿(mǎn)意就很難切換。而且,由于很多無(wú)服務(wù)器計(jì)算都是在供應(yīng)商的基礎(chǔ)設(shè)施上進(jìn)行的,因此很難將無(wú)服務(wù)器代碼集成到內(nèi)部開(kāi)發(fā)和測(cè)試管道中。
無(wú)服務(wù)器供應(yīng)商:AWS Lambda、Azure Functions和Google Cloud Functions
無(wú)服務(wù)器計(jì)算的現(xiàn)代時(shí)代始于2014年,當(dāng)時(shí)推出基于亞馬遜云服務(wù)的AWS Lambda。微軟公司于2016年推出了Azure Functions。自2017年以來(lái)一直處于測(cè)試階段的Google Cloud Functions終于達(dá)到了生產(chǎn)狀態(tài)。這三種服務(wù)的局限性、優(yōu)勢(shì)、支持的語(yǔ)言和做事方式略有不同。Rohit Akiwatkar對(duì)這三者之間的區(qū)別進(jìn)行了詳細(xì)的描述。運(yùn)行中還有IBM Cloud Functions,它基于開(kāi)源的Apache OpenWhisk平臺(tái)。
在所有無(wú)服務(wù)器計(jì)算平臺(tái)中,AWS Lambda是最突出的,顯然已經(jīng)有更多的時(shí)間來(lái)發(fā)展和成熟。行業(yè)媒體報(bào)道了過(guò)去一年中添加到AWS Lambda的更新和新功能。
無(wú)服務(wù)器堆棧
與許多軟件領(lǐng)域的情況一樣,無(wú)服務(wù)器世界已經(jīng)看到了軟件堆棧的發(fā)展,這些軟件堆疊了構(gòu)建無(wú)服務(wù)器應(yīng)用程序所需的不同組件。每個(gè)堆棧都包含一個(gè)企業(yè)要編寫(xiě)代碼的編程語(yǔ)言,一個(gè)為企業(yè)代碼提供結(jié)構(gòu)的應(yīng)用程序框架,以及一組平臺(tái)將理解并用于啟動(dòng)代碼執(zhí)行的觸發(fā)器。
雖然企業(yè)可以混合使用這些類(lèi)別中的不同特定產(chǎn)品,但根據(jù)企業(yè)使用的供應(yīng)商的不同,存在一些限制和重疊。例如,對(duì)于語(yǔ)言,企業(yè)可以在AWS Lambda上使用Node.js、Java、Go、C#和Python,但只有JavaScript、C#和F#在Azure上工作。在涉及觸發(fā)器時(shí),AWS Lambda擁有更多的產(chǎn)品,但其中許多都是特定于AWS平臺(tái)的,如Amazon Simple Email Service和AWS CodeCommit;同時(shí),Google Cloud Functions可以由通用HTTP請(qǐng)求觸發(fā)。行業(yè)專(zhuān)家Paul Jaworski深入研究了三大產(chǎn)品中的每一個(gè)產(chǎn)品的堆棧。
無(wú)服務(wù)器框架
這個(gè)方程式的框架部分很好地定義了如何最終構(gòu)建應(yīng)用程序。亞馬遜有自己的原生產(chǎn)品,即開(kāi)源的無(wú)服務(wù)器應(yīng)用程序模型(SAM),但也有其他產(chǎn)品,其中大多數(shù)是跨平臺(tái)的,也是開(kāi)源的。其中最流行的是無(wú)服務(wù)器,并且強(qiáng)調(diào)它為每個(gè)支持的平臺(tái)提供相同的體驗(yàn),即AWS Lambda、Azure Functions、Google Cloud Functions和IBM OpenWhisk。另一個(gè)受歡迎的產(chǎn)品是Apex,它可以幫助某些提供商使用某些語(yǔ)言。
無(wú)服務(wù)器數(shù)據(jù)庫(kù)
正如上面提到的,使用無(wú)服務(wù)器代碼的一個(gè)奇怪之處是沒(méi)有持久狀態(tài),這意味著局部變量的值不會(huì)在實(shí)例化中持續(xù)存在。企業(yè)的代碼需要訪問(wèn)的任何持久性數(shù)據(jù)必須存儲(chǔ)在其他位置,并且主要供應(yīng)商的堆棧中可用的觸發(fā)器都包含企業(yè)的功能可以與之交互的數(shù)據(jù)庫(kù)。
其中一些數(shù)據(jù)庫(kù)本身稱(chēng)為無(wú)服務(wù)器。這意味著它們的行為與在本文中討論的其他無(wú)服務(wù)器功能非常相似,但顯而易見(jiàn)的例外是數(shù)據(jù)無(wú)限期存儲(chǔ)。但是,在配置和維護(hù)數(shù)據(jù)庫(kù)時(shí)所涉及的大部分管理開(kāi)銷(xiāo)都被忽略了。正如開(kāi)發(fā)人員Jeremy Daly所說(shuō),“企業(yè)所需要做的就是配置一個(gè)集群,然后所有的維護(hù)、修補(bǔ)、備份、復(fù)制和擴(kuò)展都會(huì)自動(dòng)處理。”與功能即服務(wù)產(chǎn)品一樣,企業(yè)只需支付實(shí)際使用的計(jì)算時(shí)間和資源根據(jù)需要擴(kuò)展或縮減以滿(mǎn)足需求。
三大無(wú)服務(wù)器提供商各自提供自己的無(wú)服務(wù)器數(shù)據(jù)庫(kù):亞馬遜擁有Aurora無(wú)服務(wù)器和DynamoDB,微軟擁有Azure Cosmos數(shù)據(jù)庫(kù),谷歌公司擁有Cloud Firestore。但這些并不是唯一可用的數(shù)據(jù)庫(kù)。Nemanja Novkovic提供了更多產(chǎn)品信息。
無(wú)服務(wù)器計(jì)算和Kubernetes
容器有助于為無(wú)服務(wù)器技術(shù)提供動(dòng)力,但管理它們的開(kāi)銷(xiāo)由供應(yīng)商負(fù)責(zé),因此對(duì)用戶(hù)不可見(jiàn)。許多人認(rèn)為無(wú)服務(wù)器計(jì)算是一種在不必處理其復(fù)雜性的情況下獲得容器化微服務(wù)的許多優(yōu)點(diǎn)的方法,甚至開(kāi)始談?wù)摵笕萜魇澜纭?/div>
實(shí)際上,容器和無(wú)服務(wù)器計(jì)算幾乎肯定會(huì)在未來(lái)許多年內(nèi)共存,實(shí)際上無(wú)服務(wù)器功能可以與容器化微服務(wù)存在于同一應(yīng)用程序中。Kubernetes是最受歡迎的容器編排平臺(tái),也可以管理無(wú)服務(wù)器基礎(chǔ)設(shè)施。實(shí)際上,使用Kubernetes,企業(yè)可以在單個(gè)集群上集成不同類(lèi)型的服務(wù)。
無(wú)服務(wù)器脫機(jī)
企業(yè)可能會(huì)發(fā)現(xiàn)無(wú)服務(wù)器計(jì)算開(kāi)始的前景有點(diǎn)令人生畏,因?yàn)槠髽I(yè)似乎需要與供應(yīng)商簽約才能開(kāi)展,并了解它是如何工作的。但不要擔(dān)心:有些方法可以在企業(yè)自己的本地硬件上脫機(jī)運(yùn)行無(wú)服務(wù)器代碼。例如,AWS SAM提供了一個(gè)本地功能,允許企業(yè)脫機(jī)測(cè)試Lambda代碼。如果企業(yè)正在使用的是無(wú)服務(wù)器應(yīng)用程序框架,那么可以離線查看無(wú)服務(wù)器應(yīng)用程序框架,該插件允許企業(yè)在本地運(yùn)行代碼。