簡介
不知道什么時候,出現了一個叫做Serverless架構的模式,看這個英語單詞Serverless,也就是沒有服務的意思。沒有服務怎么搭建應用程序呢?
后來仔細研究了一下,發現Serverless並不是說不需要服務,而是將服務搭建在BaaS或者FaaS平台上的。通常適用於單頁應用程序或者業務邏輯並不負責的程序。
很明顯這個serverless架構是雲廠商想出來的,目的就是要讓你用他們的服務。這個跟最近比較流行的cloud native有異曲同工之妙。
此類架構雖然消除了對傳統架構中搭建服務的需求,可能會受益於顯着降低的運營成本、復雜性和工程交付時間,但代價是增加對供應商的依賴和相對不成熟的支持服務。
本文將會詳細討論一下serverless和它背后的故事。
什么是serverless
serverless的概念毫無疑問是雲廠商提出來的,諸如微軟,谷歌,亞馬遜都是serverless的推崇者,並且在他們提供的服務中進行深度綁定和推薦。
那么什么是serverless呢?
serverless其實可以描述兩種狀態。第一種狀態就是那些富客戶端,對於富客戶端來說業務邏輯都可以在客戶端完成,在雲端只需要用到數據庫服務或者身份驗證服務即可,這些類型的服務被稱為BaaS。
還有一種就是服務器端邏輯仍由應用程序開發人員編寫,但與傳統架構不同,它運行在無狀態計算容器中,這些容器是事件觸發的、短暫的(可能只持續一次調用),並完全由第三方來調用。這種服務被稱為功能即服務或FaaS。最有名的就是現在比較火的雲上的Lambda服務了。
serverless的例子
簡單的三層服務
接下來我們來舉幾個具體可以使用到serverless的例子,方便大家的理解。
考慮一個最最常見的web項目,提供了增刪改查的功能。很明顯,我們需要一個客戶端,一個服務器端和一個數據庫,如下圖所示:

上圖是一個最簡單的服務的例子,我們有一個客戶端用來展示對應的UI界面,一般來說這個客戶端就是瀏覽器。還有一個服務端用來接收所有的客戶端請求和業務邏輯處理。最后有一個數據庫用來存儲對應的數據。
如果將上面的服務轉換成為serverless架構,該如何修改呢?
在serverless架構中,服務端沒有了,轉而被各種FaaS所替代。然后客戶端的功能會被增強,變成富客戶端,大部分的業務邏輯都會在客戶端進行,甚至在某些情況下可以直接從客戶端讀取數據庫。
必須使用到FaaS服務的業務邏輯需要被拆分,如下圖所示:

上圖中,我們使用了第三方的雲認證服務來進行安全認證。同時對於不重要的數據可以直接授權客戶端進行數據庫的查詢。
對於更新服務,還是需要借助於FaaS提供的更新API來對數據庫進行更新。
可以看到,Serverless的架構已經和原來的架構完全不同了。帶來的好處就是系統變得更加靈活,並且對功能重新做了划分,減少了服務端的業務邏輯,有點分布式的效果,對應的服務器成本更低。
缺點就是原來的一個服務被拆分成為了多個服務,需要對多個服務進行監控,然后基本上所有的數據都存放在雲端,那么對服務提供商的安全能力提出了更高的要求。最后,這種靈活性和成本的減少會帶來系統的復雜性,增加了維護的難度。
消息驅動
一個常見的消息驅動的例子就是前端的點擊流上報。當用戶在客戶端點擊某個按鈕之后,會去調用服務端的某個接口。這個接口會將點擊消息發送到消息隊列中,然后再啟用異步的后端服務從消息隊列中拿取消息,最后更新數據庫。

那么上面的例子如果用Serverless該怎么實現呢?
我們需要將服務端替換成FaaS,並且將異步服務也替換成對應的FaaS:

這里的好處是可以借助FaaS的快速拓展功能,在消息數量比較多的情況下,可以動態擴展消息處理函數,從而提升系統的處理速度。
FaaS
上面我們提到了很多次FaaS,那么FaaS到底是什么呢?
按照它的英文原意,FaaS就是函數作為服務。或者你可以看做是亞馬遜的 AWS Lambda 服務。
AWS Lambda 可以不需要任何服務器就可以運行,只需要上傳你的業務代碼,就可以自動生成一個Lambda服務。然后這個服務就可以供外部調用。
當然,這里的不需要服務器是指客戶不需要自己購買服務器和在上面搭建服務,事實上lambda也是需要在服務器上運行的。
FaaS 基本上可以兼容Javascript、Python、Go和任何jvm語言編寫的代碼,只需要做少許更改即可重新生成為FaaS服務。
FaaS的另外一個優點就是可以水平擴展,並且這個水平擴展是完全自動的。這個水平擴展自動管理是由運營商來控制的,用戶不需要考慮到實現的底層細節。這種水平擴展能力對於服務在某個時刻的峰值應用是非常有效的。
我們只需要設計好FaaS函數,剩下的一切都交給雲廠商去做即可。
FaaS的缺點
FaaS是無狀態的,也就是說你不能夠使用本地內存變量或者本地磁盤的數據,因為FaaS不能保證這些數據的有效性和持久性。
所以需要對要存儲的數據進行外部持久化。
另外,由於雲服務器的限制,每次FaaS的調用都有一個最長超時時間,所以FaaS只適合那些能夠快速響應的程序。
另外,FaaS在啟動的時候可能需要初始化,這種函數的實例化可能會帶來請求的延遲。所以需要考慮雲提供商的啟動策略,並作出相應的調整。
當我們決定使用任何外包策略時,您都將部分系統的控制權交給第三方供應商。這種缺乏控制可能表現為系統停機、意外限制、成本變化、功能丟失、強制 API 升級等。
- 多租戶問題
多租戶是指多個不同客戶(或租戶)的多個軟件實例在同一台機器上運行的情況,並且可能在同一托管應用程序中運行。這是一種雲服務商實現規模經濟效益的策略。服務供應商盡最大努力讓客戶覺得他們每個人都是唯一使用他們系統的人,但是,沒有一個完美的方案能夠同時解決多租戶的安全性(一個客戶能夠看到另一個客戶的數據)、健壯性(一個客戶的軟件中的錯誤導致另一個客戶的軟件出現故障)和性能(一個高負載的客戶)等方面的問題。
- 供應商綁定
如果你在一個服務商使用了serverless,那么將其切換到另外一個供應商的成本是巨大的。可能需要更新對應的運營工具,還可能需要更新代碼。
FaaS的優點
我們可以把Serverless看做是最簡單的外包解決方案,你不需要自己管理服務器和數據庫,這些都可以托管給雲廠商。
一方面,基礎設施服務的投入變少了,另外一方面,可以節約維護這些基礎設施的人力成本。
另外,您對代碼進行的任何性能優化不僅會提高應用程序的速度,而且它們將與降低運營成本有直接或者間接的聯系,具體取決於服務供應商的收費方案。例如,假設一個應用程序最初需要一秒鍾來處理一個事件。如果通過代碼優化將這一時間減少到 200 毫秒,將立即看到計算成本節省 80%,而無需進行任何基礎架構更改。
與部署整個服務器相比,打包和部署 FaaS 功能很簡單。您所做的就是將所有代碼打包成一個 zip 文件,然后上傳。
總結
serverless架構是目前比較熱門的一種架構方式,我們可以去嘗試使用這種新的架構方式,來看看能否給我們的業務帶來不同的變化。但是也需要看到並不是所有的服務都可以使用serverless架構。我們需要對其進行權衡。
本文已收錄於 http://www.flydean.com/11-serverless-architecture/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!