Serverless 是炙手可熱的技術(shù),被認(rèn)為是云計(jì)算發(fā)展的未來(lái)方向。尤其是在前端研發(fā)領(lǐng)域,使用 Node 開(kāi)發(fā)云函數(shù),可以讓前端工程師更加專(zhuān)注于業(yè)務(wù)邏輯,實(shí)現(xiàn)全棧工程師的角色轉(zhuǎn)變。 Serverless 的優(yōu)勢(shì)技術(shù) Leader 和架構(gòu)師在進(jìn)行技術(shù)選型時(shí)會(huì)關(guān)注很多指標(biāo), Serverless 貢獻(xiàn)最大的就是 研發(fā)交付速度(Time to Market) 和 成本(Cost)。 研發(fā)交付速度方面,衡量的指標(biāo)是 Time to Market,是從需求產(chǎn)出到上線(xiàn)所用的總時(shí)長(zhǎng),Serverless 在這方面的優(yōu)勢(shì)在技術(shù)和團(tuán)隊(duì)協(xié)作兩個(gè)視角上均有體現(xiàn)。 一是技術(shù)視角。 有一種觀(guān)點(diǎn)稱(chēng) Serverless 是一種很簡(jiǎn)單的技術(shù),我對(duì)這種觀(guān)點(diǎn)并不完全同意。Serverless 架構(gòu)讓用戶(hù)和底層架構(gòu)的關(guān)系發(fā)生了變化,之前開(kāi)發(fā)者需要關(guān)注核心業(yè)務(wù)邏輯、運(yùn)維和底層架構(gòu)的治理,在 Serverless 架構(gòu)中底層的部分由 Serverless 架構(gòu)提供方來(lái)解決。從整個(gè)應(yīng)用系統(tǒng)的角度來(lái)看,系統(tǒng)架構(gòu)的難度和復(fù)雜度并沒(méi)有實(shí)質(zhì)簡(jiǎn)化。 這里我們不展開(kāi)講 Serverless 架構(gòu)的底層實(shí)現(xiàn)細(xì)節(jié)。只需要了解一點(diǎn):Serverless 底層架構(gòu)做的事情越多,業(yè)務(wù)層面需要關(guān)注的架構(gòu)和運(yùn)維工作就越少,因?yàn)樽龅墓ぷ魃倭?,所以交付的時(shí)間就更快了。 二是團(tuán)隊(duì)協(xié)作視角。在 Serverless 的模式下,全棧開(kāi)發(fā)的工作模式會(huì)執(zhí)行得更加順暢。我們知道,前后端分離確實(shí)是一種很好的架構(gòu)模式:細(xì)化了分工,降低了耦合,提升了復(fù)用。但隨之而來(lái)的問(wèn)題,是團(tuán)隊(duì)間的溝通成本、KPI 目標(biāo)的差異所帶來(lái)的各種催排期、接口確認(rèn)以及聯(lián)調(diào)測(cè)試。不少技術(shù)團(tuán)隊(duì)用全棧開(kāi)發(fā)的模式來(lái)解決這些問(wèn)題, Serverless 下不需要在架構(gòu)和技術(shù)?;ㄙM(fèi)過(guò)多精力,Runtime 和語(yǔ)言也沒(méi)有強(qiáng)制依賴(lài),而是完全面向業(yè)務(wù),每個(gè)前端工程師都可以是全棧的。 另一個(gè)優(yōu)勢(shì)就是 Serverless 會(huì)大大降低成本,體現(xiàn)在計(jì)算資源和人力兩個(gè)層面。 在計(jì)算資源的成本方面,主要體現(xiàn)在彈性擴(kuò)縮容量,按需付費(fèi)。在傳統(tǒng)的計(jì)算資源預(yù)算時(shí),往往為了能抗住峰值流量,系統(tǒng)容量都有 Buffer,說(shuō)白了就是日常的浪費(fèi)。 在 Serverless 模式下,當(dāng)業(yè)務(wù)代碼上線(xiàn)后,一分錢(qián)都不需要支付。只有當(dāng)真實(shí)請(qǐng)求和流量過(guò)來(lái)了,平臺(tái)才會(huì)根據(jù)請(qǐng)求量,瞬時(shí)拉起對(duì)應(yīng)數(shù)量的函數(shù)實(shí)例,去接收請(qǐng)求和執(zhí)行業(yè)務(wù)代碼,此時(shí)才需要為真正的代碼執(zhí)行所消耗的資源付費(fèi)。No Pay for Idle ,從會(huì)計(jì)學(xué)的角度,Serverless 讓計(jì)算資源從固定成本變成了可變成本。這種付費(fèi)模式對(duì)于那種流量波動(dòng)很大的業(yè)務(wù)優(yōu)勢(shì)明顯。 還要說(shuō)明的是人力成本。很多技術(shù) Leader 總抱怨人手不夠,也許真實(shí)情況并非如此,只是沒(méi)有足夠比例的人投入到業(yè)務(wù)功能的開(kāi)發(fā)和迭代上,而是去做了架構(gòu)、底層等必要的支撐性工作。我承認(rèn)這些工作確實(shí)非常有挑戰(zhàn)、非常必要,也非常重要。在 Serverless 模式下,由于不再需要關(guān)注底層架構(gòu),所以縮小這部分的工作量和人力占比,就有了更多的工程師可以放在核心業(yè)務(wù)上,多做迭代,從而加速產(chǎn)品功能的研發(fā)。這不是更高的 ROI 嗎? Serverless 的適用場(chǎng)景Serverless 適用于事件觸發(fā)的場(chǎng)景。當(dāng)某個(gè)事件發(fā)生時(shí),拉起并調(diào)用 Serverless 云函數(shù),比如文件上傳、消息隊(duì)列中的消息事件、定時(shí)器事件,也可以是 IoT 設(shè)備的某個(gè)事件。還可以用于一些文件處理,比如圖像處理、音視頻處理和日志分析等場(chǎng)景。 當(dāng)然,這些事件也包括 HTTP 請(qǐng)求事件,這是 Serverless 的一個(gè)很大的適用場(chǎng)景—— HTTP Service,主要實(shí)現(xiàn)基于 HTTP 應(yīng)用的后端服務(wù),比如 REST API、BFF 和 SSR 服務(wù),以及業(yè)務(wù)邏輯的實(shí)現(xiàn)。 我主要關(guān)注 Serverless 在 HTTP 場(chǎng)景下的應(yīng)用。這也是和前端工程師結(jié)合最緊密的部分。小到為小游戲、運(yùn)營(yíng)活動(dòng)提供后端的支持,大到整個(gè) App 或站點(diǎn)的 REST API、BFF,或是 H5 頁(yè)面的 SSR,都是 Serverless 適用的場(chǎng)景。 Serverless 對(duì)前端開(kāi)發(fā)者的意義Serverless 的諸多優(yōu)勢(shì)業(yè)內(nèi)有很多討論,也有不少文章談及。我想聚焦到前端開(kāi)發(fā)者身上來(lái)說(shuō)一說(shuō),Serverless 能夠幫助前端工程師實(shí)現(xiàn)真全棧的夢(mèng)想。可能有人會(huì)質(zhì)疑,為什么你又提出一個(gè)真全棧,和之前的全棧有什么區(qū)別嗎? 我先明確一下真全棧的定義:如何判斷一個(gè)工程師是真全棧工程師? 當(dāng)公司有了一堆產(chǎn)品功能需求,招了一個(gè)程序員張全占,如果他能從 0 到 1 把需求做成產(chǎn)品,那才叫真全棧。如果張全占完成了前端功能開(kāi)發(fā)、后端開(kāi)發(fā)以及數(shù)據(jù)庫(kù)開(kāi)發(fā),實(shí)現(xiàn)了所有的需求功能,并且部署到對(duì)應(yīng)的服務(wù)上,就完事了,那么問(wèn)題也就來(lái)了:服務(wù)掛了誰(shuí)來(lái)重啟?環(huán)境穩(wěn)定性誰(shuí)來(lái)做?日志把磁盤(pán)寫(xiě)滿(mǎn)了誰(shuí)來(lái)清理?定時(shí)任務(wù)怎么搞?產(chǎn)品突然火爆了,流量一夜間突然擴(kuò)大了十幾倍的時(shí)候(產(chǎn)品經(jīng)理狂喜中),誰(shuí)負(fù)責(zé)擴(kuò)容?這些問(wèn)題雖然不是核心業(yè)務(wù)需求,卻是每一個(gè)線(xiàn)上產(chǎn)品都必須考慮的東西,否則只能稱(chēng)為功能集合,不能稱(chēng)之為產(chǎn)品。 Serverless 架構(gòu)的出現(xiàn),將剛才說(shuō)到的一些非核心業(yè)務(wù)邏輯,以及運(yùn)維相關(guān)的事情給“屏蔽”了。前端工程師張全占只需關(guān)注前臺(tái)功能、后臺(tái)功能和數(shù)據(jù)這些核心的業(yè)務(wù)邏輯,就可以獨(dú)立做出產(chǎn)品。例如目前的微信小程序云開(kāi)發(fā)就是 Serverless 式的,開(kāi)發(fā)者完全不用關(guān)注底層架構(gòu)。 Serverless 對(duì)前端工程師群體來(lái)說(shuō)是一個(gè)機(jī)會(huì)。讓一個(gè)前端工程師能夠得到獨(dú)立負(fù)責(zé)某些產(chǎn)品研發(fā)的機(jī)會(huì),完成某些產(chǎn)品從需求到上線(xiàn)的從 0 到 1 的機(jī)會(huì),一個(gè)回歸到互聯(lián)網(wǎng)研發(fā)工程師角色的機(jī)會(huì)。我希望所有的前端工程師都有機(jī)會(huì)成為 Serverless 工程師,有機(jī)會(huì)獨(dú)立負(fù)責(zé)研發(fā)整個(gè)產(chǎn)品。 采用 Serverless 的準(zhǔn)備總體上來(lái)說(shuō),采用 Serverless 不需要工程師大量的學(xué)習(xí)和準(zhǔn)備過(guò)程。 Serverless 本身就是在現(xiàn)有的架構(gòu)中做減法,減去那些服務(wù)器的管理和配置工作。當(dāng)然在具體落地的時(shí)候,還是有一些準(zhǔn)備工作要做: 首先是明確目標(biāo),開(kāi)發(fā)者在了解 Serverless 之后,應(yīng)該去思考對(duì)于自身業(yè)務(wù)和開(kāi)發(fā)架構(gòu),采用 Serverless 是為了解決什么問(wèn)題?想取得哪方面的提升?沒(méi)有一種技術(shù)是為了用而用,都是針對(duì)具體場(chǎng)景解決具體問(wèn)題。這是第一個(gè)需要搞明白的。 明確了目標(biāo)之后,接著是 Serverless 模式下架構(gòu)的一些設(shè)計(jì)工作。與傳統(tǒng)的開(kāi)發(fā)模式一樣,系統(tǒng)設(shè)計(jì)的工作量是根據(jù)業(yè)務(wù)的復(fù)雜程度決定的。對(duì)于復(fù)雜業(yè)務(wù)邏輯來(lái)說(shuō),在開(kāi)發(fā)之前需要明確有多少個(gè)云函數(shù),每個(gè)云函數(shù)的輸入輸出定義、采用哪些 BaaS 后端服務(wù),都需要提前設(shè)計(jì)規(guī)劃好。 特別要說(shuō)明的是,這些設(shè)計(jì)和非 Serverless 并沒(méi)有什么本質(zhì)上的不同,Serverless 云函數(shù)也不是神秘莫測(cè)的。簡(jiǎn)單理解,它所提供的就是一個(gè)語(yǔ)言的 Runtime。在非 Serverless 架構(gòu)下如何執(zhí)行的代碼,Serverless 架構(gòu)下還是那樣執(zhí)行。如果業(yè)務(wù)是基于 Express 或者 koa 這類(lèi)應(yīng)用框架,那么 Serverless 云函數(shù)下,還是直接使用這些框架即可。 最后是一些實(shí)施上的準(zhǔn)備,以騰訊云函數(shù)為例,只要是寫(xiě)過(guò)代碼的,花小半天時(shí)間閱讀一些基礎(chǔ)文檔、教程,或者是跟著 Demo 走一遍,就可以立刻開(kāi)始寫(xiě)代碼,幾乎沒(méi)有什么門(mén)檻和不同。要敲黑板強(qiáng)調(diào)的是,別忘記了工程化和 CI/CD 方面的考慮,尤其是和現(xiàn)有研發(fā)流程的結(jié)合。這塊有一些小小的工作量,畢竟是開(kāi)發(fā)模式的升級(jí),但基于云函數(shù)提供的 CLI 和 SDK 都很容易實(shí)現(xiàn)。 Serverless 和云函數(shù)的關(guān)系Serverless 架構(gòu)由兩部分構(gòu)成,分別是 FaaS(Functions as a Service)和 BasS(Backend as a Sevice)。其中 FaaS 就是指云函數(shù),它是一種新的算力組織和提供方式,它讓用戶(hù)不再需要關(guān)心服務(wù)器的管理和配置,只用專(zhuān)注于核心業(yè)務(wù)邏輯業(yè)務(wù)代碼的編寫(xiě)。BaaS 指的是一些服務(wù)化的后端功能,包括數(shù)據(jù)庫(kù) / 對(duì)象存儲(chǔ)、賬戶(hù)權(quán)鑒、消息隊(duì)列、社交媒體整合和 AI 能力等,這些服務(wù)和接口在 FaaS 層使用相應(yīng)的 SDK 或 API 來(lái)連接和調(diào)用。 FaaS+BaaS 的組合,構(gòu)成了 Serverless 無(wú)服務(wù)器架構(gòu),免除了所有運(yùn)維性操作,讓企業(yè)和開(kāi)發(fā)者可以更加專(zhuān)注于核心業(yè)務(wù)的開(kāi)發(fā),實(shí)現(xiàn)快速上線(xiàn)和迭代,把握業(yè)務(wù)發(fā)展的節(jié)奏。 由此可見(jiàn),云函數(shù)是 Severless 架構(gòu)中的算力部分,是實(shí)現(xiàn) Severless 架構(gòu)的基礎(chǔ)計(jì)算資源。在 Severless 架構(gòu)下的業(yè)務(wù)系統(tǒng)中,因業(yè)務(wù)功能、需求場(chǎng)景不同,所需的 BaaS 后端服務(wù)也可能各不相同,但業(yè)務(wù)邏輯都需要通過(guò)云函數(shù)來(lái)實(shí)現(xiàn)。 具體案例剛才也提到 Serverless 本身有很多很多的應(yīng)用場(chǎng)景,這個(gè)問(wèn)題在不同的 Serverless 的場(chǎng)景下,答案也是不同的。 如果業(yè)務(wù)需求是基于類(lèi)似于 Express、koa 的應(yīng)用框架來(lái)實(shí)現(xiàn)的,那么在設(shè)計(jì)上,基本沒(méi)有任何區(qū)別。Serverless 云函數(shù)可以很好地支持這些應(yīng)用框架,只是部署方式不同而已。 如果需求場(chǎng)景不需要任何應(yīng)用框架,直接使用原生代碼,在 Serverless 架構(gòu)下進(jìn)行設(shè)計(jì)時(shí),需要以函數(shù)為粒度來(lái)考慮,將函數(shù)作為業(yè)務(wù)中的最小功能單元。 還有一個(gè)場(chǎng)景使用 Serverless 和不使用就有很大的不同——企業(yè)上云。 現(xiàn)在很多企業(yè)應(yīng)用都做應(yīng)用上云,上云其實(shí)是一件非常有技術(shù)門(mén)檻的事情。可能需要上云的代碼只有幾百行,但傳統(tǒng)上云絕不是上傳部署幾百行代碼那么簡(jiǎn)單(估計(jì)很多工程師看到 Kubernetes 那幾本厚書(shū)的時(shí)候就已經(jīng)快瘋了)。這個(gè)過(guò)程需要專(zhuān)業(yè)的、有經(jīng)驗(yàn)的工程師,花費(fèi)大量的工作,才能把業(yè)務(wù)系統(tǒng)遷移到云上。 Serverless 下的體驗(yàn)就非常不同,因?yàn)闊o(wú)服務(wù)器架構(gòu),所以不需要關(guān)注虛機(jī)或者容器配置和治理工作,基本上只用上傳代碼就完成了上云。 Serverless 的未來(lái)演化從以往的歷史來(lái)看,技術(shù)的演化還是存在一些一般規(guī)律的。 首先我預(yù)測(cè) Serverless 生態(tài)一定會(huì)趨于繁榮。一個(gè)技術(shù)很有優(yōu)勢(shì),相關(guān)的社區(qū)貢獻(xiàn),以及周邊的支持就越強(qiáng)大,用的人就越多;用的人越多,這個(gè)技術(shù)就越火,類(lèi)似于經(jīng)濟(jì)學(xué)里的有效市場(chǎng)理論。最近 Serverless 的發(fā)展很快,可能大家看到這篇內(nèi)容的時(shí)候,我們的 Serverless DB 產(chǎn)品已經(jīng)發(fā)布了,就是開(kāi)發(fā)者連數(shù)據(jù)庫(kù)的存在都不需要關(guān)注了。Serverless 的使用者會(huì)越來(lái)越多,同時(shí)生態(tài)里的貢獻(xiàn)者也會(huì)更多,整個(gè)生態(tài)也會(huì)更加繁榮。 第二個(gè)方向是 Serverless 的標(biāo)準(zhǔn)化。當(dāng)生態(tài)繁榮之后,對(duì)于標(biāo)準(zhǔn)化的需求就變得非常強(qiáng)烈了。國(guó)內(nèi)外各家云都有了自己的 Serverless 解決方案,對(duì)開(kāi)發(fā)者隱藏了底層基礎(chǔ)設(shè)置。但是各家的接口、實(shí)現(xiàn)還是不一樣。試想一下,開(kāi)發(fā)者在國(guó)內(nèi)云上用 Serverless 實(shí)現(xiàn)的代碼,在做國(guó)際化的時(shí)候,要遷移到另一個(gè)云廠(chǎng)商,卻發(fā)現(xiàn)完全無(wú)法平滑遷移是什么感受?公司內(nèi)兩個(gè)技術(shù)團(tuán)隊(duì)如何在 Serverless 的架構(gòu)下復(fù)用功能和代碼?如何能夠用統(tǒng)一的標(biāo)準(zhǔn)或者框架來(lái)構(gòu)建應(yīng)用?Serverless 開(kāi)發(fā)需要一些標(biāo)準(zhǔn),或是某一種框架來(lái)適配各個(gè)云廠(chǎng)商之間的不同實(shí)現(xiàn)和接口,很可能是 Serverless 接下來(lái)的發(fā)展方向。
|
|
來(lái)自: 看見(jiàn)就非常 > 《待分類(lèi)》