愚人節(jié)笑話:Serverless 就是無服務(wù)
上一篇《后端架構(gòu)的演進(jìn)之路:Serverless 的誕生》,我們通過簡單梳理后端架構(gòu)的發(fā)展,引出了 Serverless。你可能已經(jīng)迫不及待地想要嘗試 Serverless 了,但是 Serverless 中有很多全新概念的引入。相比于具體的應(yīng)用,Serverless 的相關(guān)理念更值得我們探討和學(xué)習(xí),那么 Serverless 到底是什么呢?
技術(shù)圈對 Serverless 的定義也在不斷地調(diào)整和變化中,所以導(dǎo)致有不少剛接觸 Serverless 的同學(xué)會認(rèn)為 FaaS 就是 Serverless,也有同學(xué)認(rèn)為 PaaS 也是 Serverless,還有同學(xué)說使用 Serverless 就沒有服務(wù)器了。總的來說,很多同學(xué)對 Serverless 到底是什么并沒有一個(gè)很清晰的認(rèn)知,概念還比較模糊。那么,接下來,我們嘗試從廣義和狹義兩個(gè)角度入手,解釋 Serverless 的架構(gòu)理念。

廣義上來說,Serverless 是一種后端架構(gòu)理念,或者說是一種思想、概念,直接翻譯過來叫做 “無服務(wù)”。但是不要被字面意思誤導(dǎo),這并不代表著應(yīng)用運(yùn)行不需要服務(wù)器。在 Serverless 時(shí)代之前,我們可以將傳統(tǒng)架構(gòu)統(tǒng)稱為 Serverful 時(shí)代,意思就是關(guān)于服務(wù)器的一切,我們都需要人工干預(yù)。而 Serverless,更準(zhǔn)確地說,應(yīng)該是開發(fā)者不用關(guān)心服務(wù)器的意思,是將服務(wù)器相關(guān)的工作交給云平臺來做。對于開發(fā)者來說,與服務(wù)器運(yùn)維有關(guān)的所有工作都不再關(guān)心,Server(服務(wù)器)是不可能真正消失的。
2019年 2 月,UC 伯克利大學(xué)發(fā)表了一篇標(biāo)題為《CloudProgramming Simplified: A Berkeley View on Serverless Computing》的論文,論文中有這樣一段對 Serverless 的描述:
在云的上下文中,Serverful 的計(jì)算就像使用低級的匯編語言編程,而 Serverless 的計(jì)算就像使用 Python 這樣的高級語言進(jìn)行編程。例如 c=a+b 這樣簡單的表達(dá)式,如果用匯編描述,就必須先選擇幾個(gè)寄存器,把值加載到寄存器,進(jìn)行數(shù)學(xué)計(jì)算,再存儲結(jié)果。
這就好比今天在云環(huán)境下 Serverful 的計(jì)算,開發(fā)首先需要分配或找到可用的資源,然后加載代碼和數(shù)據(jù),再執(zhí)行計(jì)算,將計(jì)算的結(jié)果存儲起來,最后還需要管理資源的釋放。
如果你不是計(jì)算機(jī)專業(yè),可能感知并不是很強(qiáng)烈,但從計(jì)算機(jī)專業(yè)的角度來講,這樣的比喻非常清晰。Serverful 是我們今天主流的使用云的方式,但不應(yīng)該是未來我們使用云的方式。Serverless 所希望的,是開發(fā)者用代碼去支撐業(yè)務(wù)邏輯,而對于資源的管理交給工具和云。
在 Serverful 的架構(gòu)下,我們需要關(guān)心的問題非常多,比如,根據(jù)業(yè)務(wù)流量大小等指標(biāo),響應(yīng)式地調(diào)整服務(wù)規(guī)模,實(shí)現(xiàn)自動彈性伸縮。再比如異地容災(zāi)、負(fù)載均衡、日志監(jiān)控、文件存儲等等,解決這些復(fù)雜的問題需要投入大量的人力、物力,而在 Serverless 架構(gòu)下,開發(fā)者只專注于開發(fā)業(yè)務(wù)邏輯,所有的這些與業(yè)務(wù)無關(guān)的基礎(chǔ)設(shè)施,全部交給云平臺負(fù)責(zé),由云平臺統(tǒng)一調(diào)度、運(yùn)維。

在這樣的理念指導(dǎo)下,各家云平臺廠商都有不同實(shí)現(xiàn)方案。每家云平臺提供的Serverless 服務(wù),都或多或少地存在差異。但是,按照 CNCF (云原生計(jì)算基金會) 對Serverless 計(jì)算的定義,Serverless 架構(gòu)應(yīng)該是采用 FaaS(函數(shù)即服務(wù))和 BaaS(后端即服務(wù))服務(wù)來解決問題的一種設(shè)計(jì)。這樣的定義從應(yīng)用落地的角度來說,更加的具體可行,也讓我們對 Serverless 的理解更加的清晰明了。因此,從應(yīng)用落地的角度,狹義的 Serverless 就是 FaaS+BaaS 的組合。

那么 FaaS 和 BaaS 分別是什么呢?
FaaS 是 Function as a Service 的縮寫,翻譯過來的意思是 "函數(shù)即服務(wù)" ;
BaaS 是 Backend as a Service 的縮寫,意思也很簡單,翻譯過來就是 "后端即服務(wù)"。
具體什么意思呢?我們先來看 BaaS ,前面說,Serverless 把后端架構(gòu)的工作全部包攬下來,硬件的維護(hù),集群的管理,運(yùn)行環(huán)境的搭建,全部由云平臺完成,除此之外,像緩存、數(shù)據(jù)庫、文件存儲、消息中間件等,也全部由云平臺幫我們做好,封裝起來,以接口的形式提供服務(wù),這就是 BaaS,所謂后端即服務(wù)。對于開發(fā)者,BaaS 就是一個(gè)黑盒,你不用知道我怎么做,更不需要關(guān)心我如何做,你需要什么過來拿就行了。

但是,我需要向數(shù)據(jù)庫存一條數(shù)據(jù),用戶上傳的照片我需要裁剪以后存到文件存儲中,這是需要我們編寫業(yè)務(wù)邏輯代碼完成的功能。
假設(shè)我現(xiàn)在已經(jīng)把這些邏輯代碼寫好,用的是 Node.js。前面說所有的服務(wù)器及運(yùn)行環(huán)境都放在了 BaaS 這個(gè)黑盒子中,我怎么讓這些代碼運(yùn)行呢?換句話說就是,我現(xiàn)在寫的邏輯代碼,是需要 Node.js 這個(gè)運(yùn)行環(huán)境的,怎么辦?
我們只需要將寫好的代碼,交給 Serverless 就行了,Serverless 中有專門運(yùn)行我們邏輯代碼的地方,這個(gè)地方就是 FaaS。FaaS 是以函數(shù)的方式運(yùn)行我們的代碼的,本質(zhì)上 FaaS 就是一個(gè)函數(shù)運(yùn)行平臺。大多數(shù)的 Serverless 云平臺提供的 FaaS ,都支持 Node.js、Python、Java、PHP 等編程語言。你可以選擇你喜歡的編程語言編寫函數(shù)并運(yùn)行。對于開發(fā)者來說,使用 FaaS 幾乎就是使用 Serverless 的一切了,在 FaaS 中,我們能夠體會到 Serverless 全部的特性。
首先 FaaS 函數(shù)運(yùn)行時(shí),開發(fā)者對底層的服務(wù)器是無感知的,F(xiàn)aaS 產(chǎn)品會負(fù)責(zé)服務(wù)器資源的調(diào)度和運(yùn)維。這些就是我們前面說的 BaaS,這也是 Serverless 最大的特點(diǎn),無運(yùn)維。
其次,F(xiàn)aaS 中的函數(shù)也不是持續(xù)運(yùn)行的,而是通過一定的條件進(jìn)行觸發(fā),比如 HTTP 事件、消息事件、定時(shí)器事件等。產(chǎn)生事件的源頭叫觸發(fā)器,F(xiàn)aaS 平臺會集成這些觸發(fā)器,我們直接用就行,這是 FaaS 的第二個(gè)特點(diǎn),事件驅(qū)動。
再者就是 Serverless 的付費(fèi)方式了,與其他云產(chǎn)品不同的是,Serverless 的付費(fèi)方式是按量付費(fèi),是按照 FaaS 函數(shù)執(zhí)行次數(shù)和執(zhí)行時(shí)消耗的 CPU、內(nèi)存等資源進(jìn)行計(jì)費(fèi)的,用多少付多少,不用不付費(fèi)。
同時(shí),F(xiàn)aaS 會根據(jù)并發(fā)量自動生成多個(gè)函數(shù)實(shí)例,BaaS會根據(jù)函數(shù)運(yùn)行所需要的資源量自動調(diào)配服務(wù)器資源,理論上的資源調(diào)用量沒有上限,這也就實(shí)現(xiàn)了不同訪問量的彈性伸縮了,而且是實(shí)時(shí)的彈性伸縮。

基于 FaaS 和 BaaS 的架構(gòu),是一種計(jì)算和存儲分離的架構(gòu)。計(jì)算由 FaaS 負(fù)責(zé),存儲由 BaaS 負(fù)責(zé),計(jì)算和存儲也被分開部署和收費(fèi)。這使應(yīng)用的存儲不再是應(yīng)用本身的一部分,而是演變成了獨(dú)立的云服務(wù),降低了數(shù)據(jù)丟失的風(fēng)險(xiǎn)。而應(yīng)用本身也變成了無狀態(tài)的應(yīng)用,更容易進(jìn)行調(diào)度和擴(kuò)縮容。
基于 FaaS 和 BaaS ,你的應(yīng)用就實(shí)現(xiàn)了自動彈性伸縮、按量付費(fèi)、不用關(guān)心服務(wù)器,這正是 Serverless 架構(gòu)的必要因素。所以說狹義的 Serverless 是 FaaS 和 BaaS 的組合。
這里我們也簡單總結(jié)一下,Serverless 可以不用運(yùn)維、實(shí)現(xiàn)自動的彈性伸縮、按量付費(fèi)節(jié)省成本、更高的安全性、易于迭代和部署。
Serverless 就是十全十美的嗎,不,它一樣也存在很多缺點(diǎn)。了解它的缺點(diǎn),可以讓你今后更好地進(jìn)行技術(shù)選型,決定是否用 Serverless 進(jìn)行應(yīng)用開發(fā)。那么它都有什么缺點(diǎn)呢?
依賴第三方服務(wù)
Serverless 的能力是云廠商打包提供的,所以 Serverless 產(chǎn)品一定是和云廠商綁定的。又因?yàn)?Serverless 理念和具體實(shí)現(xiàn)之間并沒有統(tǒng)一的標(biāo)準(zhǔn),比如 A 廠商認(rèn)為 Serverless 的數(shù)據(jù)庫必須使用標(biāo)準(zhǔn) SQL 規(guī)范,而 B 廠商則認(rèn)為數(shù)據(jù)庫可以使用 SQL 規(guī)范,也可以使用 JSON 文件的存儲方案,這就出現(xiàn)了不同的云廠商實(shí)現(xiàn)了不同的 FaaS 接口。我們的同一套代碼,是無法在不同的 Serverless 產(chǎn)品上運(yùn)行的,要想從一個(gè)云平臺遷移到另一個(gè)云平臺,成本非常高。
開發(fā)調(diào)試?yán)щy
Serverless 應(yīng)用依賴的云服務(wù),難以在本地環(huán)境搭建,要想在本地開發(fā)調(diào)試非常復(fù)雜。同時(shí),Serverless 架構(gòu)正處于飛速發(fā)展的階段,其開發(fā)、調(diào)試、部署工具鏈并不完善。
底層硬件的多樣性
目前 Serverless 的技術(shù)實(shí)現(xiàn)是 FaaS 和 BaaS。我們的應(yīng)用代碼在 FaaS 上運(yùn)行,但 BaaS 是個(gè)黑盒,其底層的硬件資源是不確定的,某些場景下,代碼必須運(yùn)行在某種類型的 CPU 或 GPU 上,目前云廠商并沒有提供針對底層硬件的可選項(xiàng)。
Serverless 還有很多特性,包括它其他的優(yōu)缺點(diǎn),運(yùn)行機(jī)制,開發(fā)方式等等。當(dāng)然,你也可能對前面的內(nèi)容依然處于似懂非懂的狀態(tài)。沒關(guān)系,接下來,我會在具體的應(yīng)用實(shí)踐中,帶你深入感受 Serverless的架構(gòu)理念,補(bǔ)充對 Serverless 其他特性的講解,關(guān)于Serverless 的一切,我們會在接下來的案例中,一一呈現(xiàn)。下一篇見(? ?_?)?。
推薦閱讀:
后端架構(gòu)的演進(jìn)之路:Serverless 的誕生
點(diǎn)個(gè)“在看”和“贊”吧,
畢竟我是要成為前端網(wǎng)紅的人。
