Serverless計算簡介及Serverless的形成
早在2009年,伯克利曾針對當時興起的云計算做過評論,并提出了以下6個潛在的優(yōu)點:
(理論上)無限可用的計算資源
用戶再也不需要承擔服務(wù)器運維的工作和責任
服務(wù)的按需付費成為可能
超大型數(shù)據(jù)中心的使用成本顯著降低
通過可視化資源管理,運維操作的難度大大降低
得益于分時復(fù)用,物理硬件的利用率大大提高
2009年至今的10年里,云計算領(lǐng)域已經(jīng)有了很大的發(fā)展,上述的諸多優(yōu)勢已經(jīng)成為現(xiàn)實,但最后兩點目前的實現(xiàn)仍然不夠優(yōu)秀,使得大部分的云服務(wù)使用者不得不承受復(fù)雜的運維成本和較低的硬件使用率。
當時,市場上主流的兩種云服務(wù)方案分別是亞馬遜推出的EC2和谷歌推出的App Engine (GAE)。這兩種方案分別代表了兩種思路,EC2選擇了提供底層基礎(chǔ),它的實例使用起來和一臺物理服務(wù)器十分類似,沒有任何的額外功能,你可以在上面運行任何類型、任何語言的服務(wù);相反的,GAE則選擇了提供高層抽象,包括令人印象深刻的自動縮擴容等能力,但同時對用戶能夠運行的代碼做出了限制 —— 要想獲得這些特性,就必須使用google提供的儲存和計算服務(wù),遵循相應(yīng)的規(guī)范。
最終,市場選擇了擁抱EC2這種底層硬件的虛擬方案,這主要是因為開發(fā)者們傾向于使用和自己本地開發(fā)環(huán)境相同的環(huán)境來運行服務(wù),這樣做,開發(fā)好的代碼基本不需要什么改動就可以輕易部署到云實例上去。
但這樣的決定也帶來了負面影響,采用底層硬件虛擬的方案意味著所有的運維操作都要由開發(fā)人員自己來解決,并且為了保證運行在云上的服務(wù)具有足夠的穩(wěn)定性,需要解決很多的問題,比如下面列出的這些:
提供冗余容錯能力,保證一臺機器出現(xiàn)故障時不會影響到整個服務(wù)
異地容災(zāi)和備份機制
能夠有效利用硬件資源的負載均衡方案
響應(yīng)式地調(diào)整服務(wù)的規(guī)模,實現(xiàn)自動縮擴容
實時監(jiān)控服務(wù)是否正常運行
記錄足夠的日志信息,方便debug和性能調(diào)優(yōu)
系統(tǒng)升級問題,包括安全補丁
能夠快速將服務(wù)遷移到新實例的能力
可以看到,上面的每一個問題復(fù)雜度都非常高,需要投入大量的人力物力資源才能解決,對于小規(guī)模的公司而言,全靠自己來解決這些問題顯然是不可能的。
另一方面,使用基于底層硬件虛擬的方案導(dǎo)致單個服務(wù)的開發(fā)成本也非常高,打個比方,一個簡單的業(yè)務(wù)功能,實際實現(xiàn)可能只有幾十行代碼,但卻需要添加諸多體積龐大的庫和框架(比如rpc、數(shù)據(jù)中心訪問、緩存、監(jiān)控...)才能夠運行在云服務(wù)實例上,這是嚴重拖慢開發(fā)效率的。
注意到這些問題,亞馬遜在2015年推出了AWS Lambda服務(wù),提出了Cloud Function的概念,并引起了業(yè)界對于Serverless的廣泛關(guān)注(Serverless這一詞并不是說真的沒有服務(wù)器了,只是開發(fā)人員不需要再關(guān)注服務(wù)器了,你的代碼仍然是運行在真實存在的服務(wù)器上的)。
Cloud Function最終被平臺打包成FaaS (Function as a Service, 函數(shù)即服務(wù))的形式,它代表著Serverless的核心理念。當然,云平臺也提供以BaaS (Backend as a Service)形式存在的Serverless服務(wù)框架。簡單的說,Serverless Computing = FaaS + BaaS。
以我們的觀點而言,一個serverless應(yīng)用必須能夠?qū)崿F(xiàn)自動縮擴容和按使用量計費。cloud function做到了這一點,因此我們將其視為當今serverless計算的基本元素。在本文剩下的部分中,將會關(guān)注和論述cloud function的形成、演化以及未來;進一步會給serverless計算下一個定義,列舉它所面臨的挑戰(zhàn)和機遇。盡管我們還不知道究竟哪種解決方案會取得最終的勝利,但我們相信所有困擾serverless的問題最終都將會被解決,讓這一概念真正成為云計算的門面(become the face of cloud computing)。
2. Serverless的形成
對于任何一個serverless平臺而言,用戶都只需要使用高級語言編寫一個cloud function,然后選擇一個觸發(fā)該函數(shù)運行的觸發(fā)器 (trigger)(比如文件上傳、數(shù)據(jù)庫的改動等),其余的工作(實例選擇、縮擴容、部署、容災(zāi)、監(jiān)控、日志、安全補丁...)則全部由serverless系統(tǒng)托管。下面的表格總結(jié)了在serverless和傳統(tǒng)云計算(我們稱其為serverful)兩種方式的一些區(qū)別:
接著我們給出一張serverless云的架構(gòu)圖:
從上圖中可以看出serverless是如何簡化應(yīng)用的開發(fā)流程和資源使用方式的,在云平臺的環(huán)境下,傳統(tǒng)的serverful開發(fā)方式就像是在使用匯編這樣的底層語言,而serverless則像是在使用python這樣的高級語言。換言之,當今serverless帶給我們的提升,正如當年高級語言替代匯編一樣,是一種質(zhì)的改變。
準確的說,我們認為serverless相比serverful,有以下3個顯著的改變:
弱化了儲存和計算之間的聯(lián)系。 服務(wù)的儲存和計算被分開部署和收費,服務(wù)的儲存不再是它本身的一部分,而是演變成了獨立的云服務(wù),這使得計算變得無狀態(tài)化,更容易調(diào)度和縮擴容,同時也降低了數(shù)據(jù)丟失的風(fēng)險。
代碼的執(zhí)行不再需要手動分配資源。 我們再也不需要為服務(wù)的運行指定需要的資源(比如使用幾臺機器、多大的帶寬、多大的磁盤...),只需要提供一份代碼,剩下的交由serverless平臺去處理就行了
按使用量計費。 serverless按照服務(wù)的使用量(調(diào)用次數(shù)、時長等)進行計費,而不是像傳統(tǒng)的serverful服務(wù)那樣,按照使用的資源(ECS實例、VM的規(guī)格等)計費。
基于上述的三個改變,接下來我們將解釋serverlss和一些相似的產(chǎn)品究竟有何不同。