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