BaaS、FaaS、Serverless都是什麼餡兒?

博文視點發表於2017-10-16

小編說:軟體行業是一個飛速發展的行業,不斷推出新技術,以及令人目不暇接的概念和術語。釐清各種概念和術語的含義,對於分析技術發展趨勢,決定是否需要及時入坑很有必要。今天我們就來聊一聊最近被熱烈討論的Serverless,以及與之相關的兩個概念BaaS及FaaS。本文編譯自What’s Serverless?(O’Reilly電子書)作者:Mike Roberts,John Chapin。

  國內外的各大雲廠商 Amazon、微軟、Google、IBM、阿里雲、騰訊雲相繼推出Serverless產品,Serverless實際上涵蓋了很多技術,可以分為兩類:BaaS和FaaS。

BaaS

  BaaS(Backend as a Service,後端即服務)是指我們不再編寫和/或管理所有服務端元件。與虛擬例項和容器相比,在概念上它更接近SaaS(軟體即服務)。SaaS主要是業務流程的外包——HR、銷售工具,或者從技術端來講,像Github這樣的產品,而BaaS則是要把應用拆分為更小的顆粒,其中一部分完全使用外部產品實現。

  BaaS 服務都是領域通用的遠端元件(而不是程式內的庫),可以以 API 的形式使用,深受移動 App 或者單頁Web app開發團隊的歡迎。因為這些團隊通常會使用大量的第三方服務,否則他們就要自己花很多精力做這些事情。我們來看一些例子。

  Google Firebase是完全由雲廠商(Google)管理的資料庫,可以直接在移動或者Web應用中使用,而無須經過我們自己的中間層應用伺服器。這解釋了BaaS的一個方面:用服務替我們管理資料元件。

  BaaS服務還允許我們倚賴其他人已經實現的應用邏輯。對於這點,認證就是一個很好的例子。很多應用都要自己編寫實現註冊、登入、密碼管理等邏輯的程式碼,而其實對於不同的應用這些程式碼往往大同小異。完全可以把這些重複性的工作提取出來,再做成外部服務,而這正是Auth0和Amazon Cognito等產品的目標。它們能實現全面的認證和使用者管理,開發團隊再也不用自己編寫或者管理實現這些功能的程式碼。

  BaaS這個詞是隨著移動應用開發火起來的。事實上,它有時指的是MBaaS(Mobile Backend as a Service)。然而,使用完全託管在外部的產品來開發應用,這個理念並不是移動開發,或者更一般地說,前端開發,所獨有的。比如,我們可以不再管理EC2機器上的MySQL資料庫伺服器,轉而使用Amazon的RDS服務,或者我們可以用Kinesis取代我們自己的Kafka訊息匯流排。其他資料基礎設施服務還有:檔案系統/物件儲存(如Amazon S3)、資料倉儲(如Amazon Redshift),而更面向邏輯的服務,比如語音分析(如Amazon Lex)以及前面提到的認證,也可以直接在服務端元件中使用。這其中有很多服務都可以認為是Serverless,但並非全部都是。

FaaS/Serverless計算

  事實上,Serverless 還有一半是 FaaS(Function asa Service,也即函式即服務)。FaaS 是Compute as a Service(計算即服務)的一種形式。事實上,有些人(特別是AWS)說FaaS就是Serverless計算。當然,不可否認,AWS的Lambda是如今被採用得最廣泛的FaaS實現。

  FaaS是一種構建和部署服務端軟體的新方式,面向部署單個的函式或者操作。關於Serverless許多時髦的詞兒都來自FaaS。很多人認為Serverless就是FaaS,其實他們是隻知其一不知其二。

  我們部署服務端軟體的傳統方式都是這樣開始的:先要有一個主機例項,一般是一個虛擬機器(VM)或者容器(見圖1),然後把應用部署在主機上。如果主機是VM或者容器,那麼我們的應用就是一個作業系統程式。通常我們的應用裡包含各種相關操作的程式碼——比如一個Web服務可能要收回和更新資源。

圖1 傳統服務端軟體的部署

  FaaS改變了這種部署模式(見圖2)。我們去掉主機例項和應用程式,僅關注表達應用邏輯的那些操作或者函式。我們把這些函式上傳至由雲廠商提供的FaaS平臺。

圖2 FaaS軟體部署

  但是在一個伺服器程式中,函式不是一直處於執行狀態的,它們只會在需要的時候才執行,其他時間都是空閒狀態(見圖3)。我們可以對FaaS平臺進行配置,讓它為每一個操作監聽特定事件。一旦該事件發生,平臺就會例項化Lambda函式,然後再用這個觸發事件來呼叫該函式。

圖3 FaaS函式生命週期

  一旦這個函式執行完畢,FaaS平臺就可以隨意銷燬它。或者,平臺將其保留一會兒,直到有另一個事件需要處理。

  FaaS本質上是事件驅動的途徑。除了提供一個平臺儲存和執行程式碼,FaaS供應商還會將各種同步和非同步事件源整合起來。比如 HTTP API Gateway 就是一個同步源;而託管的訊息匯流排、物件儲存,或者協調的事件就是非同步源。

  2014年秋 Amazon 釋出了 AWS Lambda,經過3年時間,該產品已經逐漸成熟,開始被一些企業採納。有些Lambda函式的使用量非常少,一天就幾次,而也有些公司使用Lambda每天處理數十億事件。截至本文寫作之時,Lambda已經整合了15種以上的不同事件源,可以滿足各種不同應用的需求。

  除了大家所熟識的 AWS Lambda 之外,微軟、IBM及Google等大公司,以及一些更小的廠商比如Auth0,也提供商業FaaS。正如各種Computer-as-a-Service平臺(IaaS、PaaS、Container-as-a-Service)一樣,現在也有一些開源FaaS專案,你可以在自己的硬體或者公有云平臺上執行。目前這類私有FaaS還處於混戰時代,並沒有明顯的冒尖者。Galactic Fog、IronFunctions及Fission(使用的是Kubernetes),以及IBM公司自己的OpenWhisk均屬於開源系的FaaS。

Serverless的關鍵

  從表面上看,BaaS和FaaS是兩碼事——前者是把應用中的各個部分完全外包出去,後者是一種新的執行程式碼的託管環境。那麼,為什麼要把它們都劃歸為Serverless呢?關鍵在於,它們都不需要你管理自己的伺服器主機或者伺服器程式。一個完全Serverless的app不需要你考慮架構中的任何東西。你的應用邏輯——不管是自己程式設計實現,還是使用第三方服務整合——執行在一個完全彈性的操作環境裡。你的狀態也是以同樣彈性的形式儲存的。

  Serverless並不意味著沒有伺服器,而是你不需要操心伺服器相關的事情。

跨越式變革

  Serverless是變革。過去十年來,我們已經把應用和環境中很多通用的部分變成了服務。Serverless也有這樣的趨勢——如把主機管理、作業系統管理、資源分配、擴容,甚至是應用邏輯的全部元件都外包出去,把它們都看作某種形式的商品——廠商提供服務,我們掏錢購買。這是雲端計算向縱深發展的一種自然而然的過程。

  但是,Serverless給應用架構帶來巨大的變化。直到現在,大多數雲服務並沒有從根本上改變我們設計應用的方式。比如,使用Docker時,把一個小“箱子”放到應用邊上,但是它仍然是一個箱子,而我們的應用也沒有顯著改變。當我們把自己的MySQL例項託管到雲上時,還是要思考需要怎樣的虛擬機器來處理負載,考慮故障轉移問題。

  Serverless帶來躍進式的變化。Serverless FaaS開啟的是一種全新的應用架構,完全由事件驅動。更細粒度的部署,需要在 FaaS 元件外面持久化狀態。Serverless BaaS把我們從編寫邏輯元件中解放出來,但是我們必須將應用與雲廠商提供的特定介面與模式整合。

  說一千道一萬,Serverless應用如此特別,它長什麼樣呢?有什麼優缺點,適合什麼樣的場景呢?只有自己做一個應用來親身體會一下,才有發言權。

  以上內容節選自《Serverless架構:無伺服器單頁應用開發》,點此連結可在博文視點官網檢視此書。
                  圖片描述
  想及時獲得更多精彩文章,可在微信中搜尋“博文視點”或者掃描下方二維碼並關注。
                    圖片描述

相關文章