無服務(wù)器計(jì)算(Severless computing,簡稱 Serverless)現(xiàn)在是軟件架構(gòu)圈中的熱門話題,三大云計(jì)算供應(yīng)商(Amazon、Google 和 Microsoft)都在大力投入這個領(lǐng)域,涌現(xiàn)了不計(jì)其數(shù)的相關(guān)書籍、開源框架、商業(yè)產(chǎn)品、技術(shù)大會。但是什么是無服務(wù)器,為什么值得考慮?我希望在本文中對這些問題有所啟發(fā)。
什么是Serverless?
就像軟件行業(yè)中的很多趨勢一樣,Serverless 的界限并不是特別清晰,尤其是它還涵蓋了兩個互相有重疊的概念:
1)Serverless 最早用于描述那些大部分或者完全依賴于第三方(云端)應(yīng)用或服務(wù)來管理服務(wù)器端邏輯和狀態(tài)的應(yīng)用,這些應(yīng)用通常是富客戶端應(yīng)用(單頁應(yīng)用或者移動端 App),建立在云服務(wù)生態(tài)之上,包括數(shù)據(jù)庫(Parse、Firebase)、賬號系統(tǒng)(Auth0、AWS Cognito)等。這些服務(wù)最早被稱為 “(Mobile) Backend as a Service”,下文將對此簡稱為 “BaaS”。
2)Serverless 還可以指這種情況:應(yīng)用的一部分服務(wù)端邏輯依然由開發(fā)者完成,但是和傳統(tǒng)架構(gòu)不同,它運(yùn)行在一個無狀態(tài)的計(jì)算容器中,由事件驅(qū)動、生命周期很短(甚至只有一次調(diào)用)、完全由第三方管理。這種情況稱為 Functions as a service / FaaS。AWS Lambda 是目前的熱門 FaaS 實(shí)現(xiàn)之一,下文將對此簡稱為 “FaaS”。
界面驅(qū)動的應(yīng)用(UI-driven applications)
我們來設(shè)想一個傳統(tǒng)的三層C/S 架構(gòu),例如一個常見的電子商務(wù)應(yīng)用(比如在線寵物商店),假設(shè)它服務(wù)端用 Java,客戶端用 HTML/JavaScript:
在這個架構(gòu)下客戶端通常沒什么功能,系統(tǒng)中的大部分邏輯——身份驗(yàn)證、頁面導(dǎo)航、搜索、交易——都在服務(wù)端實(shí)現(xiàn)。
把它改造成Serverless 架構(gòu)的話會是這樣:
這是張大幅簡化的架構(gòu)圖,但還是有相當(dāng)多變化之處:
我們移除了最初應(yīng)用中的身份驗(yàn)證邏輯,換用一個第三方的BaaS 服務(wù)。
另一個BaaS 示例:我們允許客戶端直接訪問一部分?jǐn)?shù)據(jù)庫內(nèi)容,這部分?jǐn)?shù)據(jù)完全由第三方托管(如 AWS Dynamo),這里我們會用一些安全配置來管理客戶端訪問相應(yīng)數(shù)據(jù)的權(quán)限。
前面兩點(diǎn)已經(jīng)隱含了非常重要的第三點(diǎn):先前服務(wù)器端的部分邏輯已經(jīng)轉(zhuǎn)移到了客戶端,如保持用戶Session、理解應(yīng)用的 UX 結(jié)構(gòu)(做頁面導(dǎo)航)、獲取數(shù)據(jù)并渲染出用戶界面等等??蛻舳藢?shí)際上已經(jīng)在逐步演變?yōu)閱雾搼?yīng)用。
還有一些任務(wù)需要保留在服務(wù)器上,比如繁重的計(jì)算任務(wù)或者需要訪問大量數(shù)據(jù)的操作。這里以“搜索”為例,搜索功能可以從持續(xù)運(yùn)行的服務(wù)端中拆分出來,以 FaaS 的方式實(shí)現(xiàn),從 API 網(wǎng)關(guān)(后文做詳細(xì)解釋)接收請求返回響應(yīng)。這個服務(wù)器端函數(shù)可以和客戶端一樣,從同一個數(shù)據(jù)庫讀取產(chǎn)品數(shù)據(jù)。 我們原始的服務(wù)器端是用 Java 寫的,而 AWS Lambda(假定我們用的這家 FaaS 平臺)也支持 Java,那么原先的搜索代碼略作修改就能實(shí)現(xiàn)這個搜索函數(shù)。
最后我們還可以把“購買”功能改寫為另一個 FaaS 函數(shù),出于安全考慮它需要在服務(wù)器端,而非客戶端實(shí)現(xiàn)。它同樣經(jīng)由 API 網(wǎng)關(guān)暴露給外部使用。
消息驅(qū)動的應(yīng)用(Message-driven applications)
再舉一個后端數(shù)據(jù)處理服務(wù)的例子。假設(shè)你在做一個需要快速響應(yīng)UI 的用戶中心應(yīng)用,同時你又想捕捉記錄所有的用戶行為。設(shè)想一個在線廣告系統(tǒng),當(dāng)用戶點(diǎn)擊了廣告你需要立刻跳轉(zhuǎn)到廣告目標(biāo),同時你還需要記錄這次點(diǎn)擊以便向廣告客戶收費(fèi)。
傳統(tǒng)的架構(gòu)會是這樣:“廣告服務(wù)器”同步響應(yīng)用戶的點(diǎn)擊,同時發(fā)送一條消息給“點(diǎn)擊處理應(yīng)用”,異步地更新數(shù)據(jù)庫(例如從客戶的賬戶里扣款)。
在Serverless 架構(gòu)下會是這樣:
這里兩個架構(gòu)的差異比我們上一個例子要小很多。我們把一個長期保持在內(nèi)存中待命的任務(wù)替換為托管在第三方平臺上以事件驅(qū)動的FaaS 函數(shù)。注意這個第三方平臺提供了消息代理和 FaaS 執(zhí)行環(huán)境,這兩個緊密相關(guān)的系統(tǒng)。
評論