深入理解Serverless架構(gòu)
隨著2014年AWS Lambda的發(fā)布和流行,近年來有關(guān)Serverless的話題和討論越來越頻繁。究竟什么是Serverless?為什么需要Serverless? Serverless是否意味著從此不再需要服務(wù)器了?Serverless究竟能為開發(fā)運維帶來哪些便利呢?
回溯本源
讓我們先來回顧一下常見的應(yīng)用服務(wù)開發(fā)上線流程。
一、直接使用物理設(shè)備
開發(fā)者將應(yīng)用程序開發(fā)測試完畢后,直接將程序和相關(guān)軟件部署在物理設(shè)備上。服務(wù)器直接使用物理機。這種方式將不可避免地需要大量人工運維和重復(fù)勞動。比方說,用戶數(shù)量逐漸增長時,我們需要擴(kuò)容物理設(shè)備以應(yīng)對更高的網(wǎng)站訪問壓力。這時候我們需要購置更多的物理服務(wù)器,并且搬運到機房的對應(yīng)機架機柜中。然后,我們需要手動為新購置的物理服務(wù)器安裝各種運行軟件,填寫好配置文件,手動部署啟動好需要運行的應(yīng)用程序。這些大量的重復(fù)運維勞動造成產(chǎn)品上線慢,迭代周期長。其次,使用物理設(shè)備直接部署應(yīng)用程序?qū)?dǎo)致資源浪費。如今的物理服務(wù)器的配置越來越強大,64核128G在今天看來也不過是普通配置。很難想象你買了一臺32核的物理機,卻只想搭建個人博客。此外,電商行業(yè)經(jīng)常為了應(yīng)對促銷秒殺等活動準(zhǔn)備大量的物理資源,然而在非促銷等流量低谷時段,大量物理資源處理閑置狀態(tài),不利于節(jié)約成本。
最后,為了解決資源浪費的問題,我們很容易想到,可以將多個應(yīng)用程序部署在同一臺服務(wù)器上來充分利用資源。但由此又導(dǎo)致了新的麻煩,不同的應(yīng)用程序經(jīng)常會搶占CPU,磁盤IO,內(nèi)存,難以做到隔離資源,各行其是,互不干擾。
二、IaaS托管硬件
虛擬化技術(shù)的成熟直接解決了上述直接使用物理設(shè)備的幾個痛點。
首先,使用IaaS平臺,服務(wù)器由物理機變成了虛擬機。申請服務(wù)器資源僅需要調(diào)用IaaS平臺的API或者點擊控制臺頁面就可以輕松完成。CPU個數(shù),內(nèi)存大小,網(wǎng)絡(luò)帶寬,存儲磁盤大小都可以按需指定,隨心所欲。虛擬機被玩壞了也不需要重裝系統(tǒng)修復(fù),刪除重建新虛擬機即可。擴(kuò)容服務(wù)器不再需要大量的重復(fù)人工運維勞動,加速了產(chǎn)品上線和迭代。
其次,使用IaaS平臺一定程度上減輕了資源浪費。在IaaS平臺上很容易申請和刪除虛擬機,升降帶寬配置等操作,這樣當(dāng)業(yè)務(wù)低谷時段直接刪除多余的虛擬機,降低帶寬購買配額,就能節(jié)約不少成本。
最后,IaaS平臺解決了資源隔離的問題。不同虛擬機之間有獨立CPU,內(nèi)存,磁盤,網(wǎng)卡,不同虛擬機之間的程序不會進(jìn)行資源搶占。
然而,IaaS平臺僅僅為開發(fā)者做好了硬件托管的工作。開發(fā)者依然需要為虛擬機安裝操作系統(tǒng)和各種軟件,填寫配置并部署應(yīng)用;依然需要關(guān)注服務(wù)器,帶寬,存儲等資源的使用量和擴(kuò)容縮容。此外,IaaS平臺沒有完全解決資源浪費的問題,實際上,大量虛擬機在日常運行中依然存在超低負(fù)載運行的情況。
三、 PaaS托管應(yīng)用
使用PaaS平臺,開發(fā)者無需關(guān)注服務(wù)器的申請采購、系統(tǒng)安裝和資源容量。PaaS服務(wù)提供商為開發(fā)者提供好了操作系統(tǒng)和開發(fā)環(huán)境以及支持的SDK和API,還能自動調(diào)整資源來幫助應(yīng)用服務(wù)更好的應(yīng)對突發(fā)流量。有了PaaS平臺,開發(fā)者僅僅需要把應(yīng)用開發(fā)好,然后在PaaS平臺完成服務(wù)部署,應(yīng)用服務(wù)即可上線。
相比IaaS平臺,PaaS平臺能更加精準(zhǔn)地為應(yīng)用程序所消耗的資源計費。IaaS平臺僅僅依據(jù)用戶申請的資源量,如CPU核心數(shù),網(wǎng)絡(luò)帶寬來計費,而不關(guān)注用戶是否實際真正充分使用到了其所申請到的資源。PaaS平臺則可以通過統(tǒng)計應(yīng)用程序所占用的CPU使用率和內(nèi)存使用率來做的更精準(zhǔn)的計費,甚至可以實現(xiàn)應(yīng)用層面的計費,比如服務(wù)響應(yīng)時間,或者應(yīng)用所消耗的事務(wù)。
1. 什么是Serverless?
Serverless指的是由開發(fā)者實現(xiàn)的服務(wù)端邏輯運行在無狀態(tài)的計算容器中,它由事件觸發(fā), 完全被第三方管理,其業(yè)務(wù)層面的狀態(tài)則被開發(fā)者使用的數(shù)據(jù)庫和存儲資源所記錄。
以上圖為例,圖中上半部分描述的是互聯(lián)網(wǎng)應(yīng)用傳統(tǒng)架構(gòu)的模型:用戶客戶端APP與部署在服務(wù)器端的常駐進(jìn)程通信,服務(wù)端進(jìn)程處理該應(yīng)用的大部分業(yè)務(wù)邏輯流程。下半部分則描述了Serverless架構(gòu)模型。與傳統(tǒng)架構(gòu)模型最大的不同在于,互聯(lián)網(wǎng)應(yīng)用的大部分業(yè)務(wù)邏輯流程被轉(zhuǎn)移到客戶端上,客戶端通過調(diào)用第三方服務(wù)接口來完成諸如登錄、鑒權(quán)、讀取數(shù)據(jù)庫等通用業(yè)務(wù)場景;高度定制化的業(yè)務(wù)邏輯則通過調(diào)用第三方FaaS平臺執(zhí)行自定義代碼來完成??傮w上看,Serverless架構(gòu)將傳統(tǒng)架構(gòu)中的服務(wù)器端的整串后臺流程拆分成在客戶端上執(zhí)行一個個第三方服務(wù)調(diào)用或FaaS調(diào)用。
回顧之前所述,無論是直接使用物理服務(wù)器設(shè)備部署程序,還是基于IaaS平臺托管硬件,或者使用PaaS平臺托管應(yīng)用,開發(fā)部署互聯(lián)網(wǎng)應(yīng)用都離不開傳統(tǒng)的客戶端-服務(wù)器模式,即客戶端向服務(wù)端發(fā)送請求,服務(wù)器運行處理各種業(yè)務(wù)邏輯,并響應(yīng)來自客戶端的請求。至于物理機,IaaS乃至PaaS,歸根結(jié)底只是服務(wù)器程序的部署模式不同。
而在Serverless架構(gòu)中,軟件開發(fā)者和運維工程師們不在需要關(guān)心服務(wù)器的部署、架設(shè)、伸縮,這些問題交給云平臺商來解決,程序員們得以將精力投入用代碼來實現(xiàn)業(yè)務(wù)邏輯中,而不是管理服務(wù)器。Serverless并不意味著不再需要服務(wù)器了,只是服務(wù)器資源的申請、使用、調(diào)度、伸縮由云服務(wù)商自動實現(xiàn),應(yīng)用開發(fā)者無需關(guān)心。
2. Serverless如何工作?
以一個簡單需求為例,論壇網(wǎng)站需要對用戶上傳的圖片生成一個縮略圖。
我們使用UCloud的通用計算(UGC)來實現(xiàn)該功能。
如上圖所示,使用UGC實現(xiàn)這一功能操作步驟如下:
- 用戶將縮略圖算法代碼打包推送到UGC算法倉庫中;
- 用戶從UFile中讀取原始圖片作為輸入數(shù)據(jù),調(diào)用UGC SubmitTask API,指定縮略圖算法;
- UGC平臺執(zhí)行縮略圖轉(zhuǎn)換算法,將轉(zhuǎn)換后的縮略圖返回給用戶;
- 用戶將得到的結(jié)果縮略圖存儲到UFile中。
整個過程中,開發(fā)者僅僅需要將縮略圖算法實現(xiàn)函數(shù)代碼鏡像提交到UGC算法倉庫中,然后調(diào)用UGC的提交任務(wù)API,輸入源圖片數(shù)據(jù),即可獲得計算結(jié)果。
從以上過程可以總結(jié)出:使用Serverless,開發(fā)者無需考慮服務(wù)器細(xì)節(jié),只需要負(fù)責(zé)編寫發(fā)生某些事件后所需執(zhí)行的代碼。云供應(yīng)商將負(fù)責(zé)提供用于運行這些代碼的服務(wù)器,并在必要時對服務(wù)器進(jìn)行縮放。執(zhí)行完畢后,承擔(dān)這些功能的容器會立刻停用,用戶只需為運行代碼過程中所消耗的資源付費。這種模式也被稱為做函數(shù)即服務(wù)(Function-as-a-Service,F(xiàn)aaS)。
3. 與非Serverless方案的對比
上述場景如果使用非Serverless方案,大體架構(gòu)如下:
該方案需要維護(hù)一組UHost服務(wù)集群,服務(wù)器中部署圖片縮略轉(zhuǎn)換程序。UHost的服務(wù)程序先從UFile中讀取源圖片,使用圖形庫將其轉(zhuǎn)換成縮略圖并再存回UFile中。相比之前的Serverless方案,有以下幾點對比:
- 開發(fā)者需要關(guān)心服務(wù)器端程序開發(fā)設(shè)計,將圖片處理程序部署成服務(wù)端程序,并購置服務(wù)器部署并運維管理這批UHost服務(wù)器。而使用UGC,開發(fā)者無需關(guān)注服務(wù)器端,只需要將圖形庫函數(shù)提交到UGC算法倉庫中并調(diào)用UGC API完成計算任務(wù)即可。
- UHost集群無法自動為突發(fā)流量自動伸縮擴(kuò)容,需要運維工程師手動購置更多的UHost并部署上線擴(kuò)容。而UGC能根據(jù)突發(fā)的流量自動伸縮,運行更多的函數(shù)容器。
- UHost服務(wù)器只要在運行就必須為之付費,無論請求量和負(fù)載的高低。UGC只需要為實際的調(diào)用次數(shù)和函數(shù)實際執(zhí)行時間付費,真正實現(xiàn)了按需分配付費。
4. Serverless相比PaaS的特點
相比PaaS,Serverless在以下幾個方面更具優(yōu)勢:
- 開發(fā)者無需關(guān)注服務(wù)器程序設(shè)計,部署和運維管理,開代碼重心從此轉(zhuǎn)移到調(diào)用方而非服務(wù)器端。
- 更精細(xì)粒度的計費模式,真正實現(xiàn)了按需付費(Pay as you go)。使用PaaS托管應(yīng)用,只要將應(yīng)用部署上去,無論訪問量或者負(fù)載高低,都需要計費。而使用Serverless,用戶僅僅需要為函數(shù)真正調(diào)用到的次數(shù)和執(zhí)行時間付費。
4. 使用Serverless前,你需要了解的Serverless的適用場景特點
- Serverless平臺運行的是代碼函數(shù)的片段,而不是整個程序。例如生成縮略圖場景中,UGC僅僅運行的是用圖形庫處理圖片這段代碼。
- 代碼必須做徹底的無狀態(tài)改造。Serverless平臺會自動為突發(fā)的流量自動擴(kuò)展運行函數(shù)代碼所需要的容器,但用戶代碼中無法得知其容器的部署環(huán)境情況。兩次不同的Serverless調(diào)用必須是非耦合無關(guān)聯(lián)的。
- 用戶無需關(guān)注水平擴(kuò)展,Serverless平臺會自動根據(jù)調(diào)用量擴(kuò)展運行代碼所需要的容器,輕松做到高并發(fā)調(diào)用。
- 僅僅需要上傳代碼文件或者代碼容器鏡像即可完成應(yīng)用部署。
- 代碼運行的生命周期非常短暫。通常Serverless服務(wù)商,會限制代碼的最大運行時間,例如AWS Lambda為5分鐘。
- 每次Serverless調(diào)用,Serverless平臺都會啟動容器來運行對應(yīng)代碼,調(diào)用結(jié)束后將容器銷毀。因為容器創(chuàng)建存在一定開銷,所以Serverless不太適合對延遲要求及其苛刻的場景。
5. 不是銀彈
Serveless架構(gòu)在某些場景下?lián)碛忻黠@的優(yōu)勢,但它不是解決一切架構(gòu)問題的靈丹妙藥,更不是傳統(tǒng)架構(gòu)的革命者和替代者。架構(gòu)上說,Serverless更像是一種粘合劑。以下是一些常見的不適用Serverless的情況。
Serverless平臺需要為每次FaaS調(diào)用創(chuàng)建一個容器運行對應(yīng)代碼。前面提到過,由于創(chuàng)建容器并初始化代碼運行環(huán)境存在一定程度的開銷和延時(通常在10ms級),Serverless架構(gòu)難以勝任對延遲要求非常苛刻的場景。
同樣的,由于啟動容器進(jìn)程開銷較高,Serverless架構(gòu)難以應(yīng)對非常高的并發(fā)請求場景。通常云服務(wù)商會對用戶的并發(fā)調(diào)用數(shù)做限制,比如AWS Lambda是1000。
通常FaaS平臺會對代碼運行時間做最大時間限制。如果你的代碼需要運行較長時間才能返回結(jié)果,需要慎重考慮使用Serverless。例如剛才提到的,AWS Lambda對代碼最大運行時間限制為5分鐘。
由于代碼容器在Serverless平臺部署位置環(huán)境的不確定性,使用Serverless時,我們必須對代碼做無狀態(tài)改造。如果你兩次調(diào)用存在關(guān)聯(lián)偶合,同樣請慎重考慮Serverless。
6. 其他主流公有云服務(wù)商Serverless產(chǎn)品
除了眾所周知的AWS Lambda,目前常見的Serverless產(chǎn)品還有前文提到的UCloud的通用計算 (UGC),官網(wǎng):https://www.ucloud.cn/site/product/ugc.html。
UCloud通用計算UGC具備以下特性:
- 用戶無需關(guān)心計算資源的的交付部署,以用戶算法代碼為中心;計算資源服務(wù)化,用戶通過API使用計算資源;
- 按需付費(Pay As You Go)。用戶僅需要為實際消耗的計算資源付費;
- 提供十萬核級的海量計算資源,輕松支持高并發(fā)計算任務(wù)請求,自動實現(xiàn)資源分配和擴(kuò)展;
- 具備高可用和跨可用區(qū)自動容災(zāi)能力。
作為UCloud研發(fā)的分布式大規(guī)模并行計算服務(wù),UGC能夠充分利用UCloud多個區(qū)域內(nèi)的多個可用區(qū)的計算資源,提供基于UCloud云平臺的高可用性和高并發(fā)性,同時滿足圖片處理、機器學(xué)習(xí)、大數(shù)據(jù)處理、生物數(shù)據(jù)分析等領(lǐng)域的計算需求。