Serverless 架構(gòu)簡述
作者 | 宗婷婷
隨著云服務(wù)蓬勃發(fā)展,Serverless 架構(gòu)近幾年來被越來越多的企業(yè)使用,那么什么是 Serverless 架構(gòu)呢?它有哪些優(yōu)缺點(diǎn)?這篇文章帶你詳細(xì)了解 Serverless 架構(gòu)。
什么是 Serverless 架構(gòu)?
“_Serverless architectures are application designs that incorporate third-party “Backend as a Service” (BaaS) services, and/or that include custom code run in managed, ephemeral containers on a “Functions as a Service” (FaaS) platform._”
這段來自Martin Fowler文章的定義是我覺得較清楚地講清了什么是 Serverless 架構(gòu)。那它有哪些特點(diǎn)呢?
- 它是一種應(yīng)用程序的設(shè)計(jì)。
- 它包含第三方 BaaS服務(wù)。
- 可包含運(yùn)行及托管在 FaaS 平臺(tái)上的自定義程序。
看了上面的特點(diǎn),可能你還是有點(diǎn)懵,到底什么樣的應(yīng)用程序是 Serverless 應(yīng)用程序,下面舉個(gè)例子說明。
傳統(tǒng)應(yīng)用程序
圖片
傳統(tǒng)三層架構(gòu)的應(yīng)用程序:客戶端-服務(wù)器端-數(shù)據(jù)庫。服務(wù)器端控制著大部分業(yè)務(wù)邏輯,流程及安全。在這種情況下,客戶端功能看起來很單薄,顯得也不是很智能。
Serverless 應(yīng)用程序
- 使用第三方 BaaS 服務(wù)來做鑒權(quán),如 Auth0。
- 使用第三方 BaaS 服務(wù)來存儲(chǔ)數(shù)據(jù),如 AWS DynamoDB, 客戶端可以通過不同的安全策略來訪問數(shù)據(jù)庫。
- 客戶端擁有更多的邏輯,如導(dǎo)航功能;也可以控制部分的流程。
- 去除了需要始終運(yùn)行的服務(wù)器,由 API 網(wǎng)關(guān)來響應(yīng) HTTP 請(qǐng)求,并將請(qǐng)求路由到不同的 FaaS 函數(shù)。對(duì)于搜索功能,如果將其放在客戶端,則客戶端需要從數(shù)據(jù)庫中取出非常多的數(shù)據(jù),然后再根據(jù)條件篩選出需要的數(shù)據(jù),如果數(shù)據(jù)量大的話,則非常低效,影響用戶體驗(yàn),因此將搜索功能作為 FaaS 函數(shù),放在服務(wù)器端。
- 將購課功能作為 FaaS 放在服務(wù)端,則是出于安全考慮,由于購課系統(tǒng)一般和支付相關(guān),因此對(duì)安全要求比較高。
從上面例子可以看出,Serverless 應(yīng)用程序不再需要“服務(wù)器”,Serverless 應(yīng)用程序中每個(gè)組件都可以看成一個(gè)獨(dú)立的子服務(wù)。,類似微服務(wù)。這樣的架構(gòu)更加靈活(可以很方便地去除或增加組件來添加或去除某些功能),也更加容易維護(hù)(修改某一個(gè) FaaS 函數(shù)對(duì)其他函數(shù)影響會(huì)很?。?。
但是,另一方面,這種靈活性同時(shí)也增加了系統(tǒng)的復(fù)雜性和成本,我們有可能需要維護(hù)很多個(gè) BaaS 和 FaaS 服務(wù),并且它們之間的溝通成本也會(huì)隨服務(wù)個(gè)數(shù)增加逐漸遞增。
BaaS - Backend as a Service 后端即服務(wù)
從上面例子可以看到,Serverless 架構(gòu)包含很多個(gè) BaaS 服務(wù),那么BaaS 服務(wù)是什么呢?
BaaS(后端即服務(wù))是一種云服務(wù)模型。在構(gòu)建應(yīng)用程序時(shí),有時(shí)候會(huì)將一部分后端功能外包給云平臺(tái)供應(yīng)商,這部分外包的功能就是 BaaS。如通用的身份驗(yàn)證,數(shù)據(jù)庫管理,云存儲(chǔ),消息推送和電子郵件驗(yàn)證等。將這些比較通用的功能外包給云平臺(tái)供應(yīng)商可以大大降低開發(fā)及維護(hù)成本。因此在 Serverless 架構(gòu)中會(huì)集成多個(gè) BaaS 服務(wù),從而提升開發(fā)進(jìn)度。
FaaS - Function as a Service 函數(shù)即服務(wù)
從前面的例子可以看出,Serverless 架構(gòu)將傳統(tǒng)服務(wù)器端的功能分散到不同組件中,一部分打包給 BaaS 服務(wù),一部分放在客戶端,還有一部分交給 FaaS 函數(shù)。
對(duì)于 BaaS 服務(wù)來說,因?yàn)橛傻谌教峁晕覀兏嗫紤]的是怎么集成。對(duì)客戶端來說,需要有 UI developer 來實(shí)現(xiàn)這部分功能。對(duì)于 FaaS,它以函數(shù)的形式提供服務(wù),承載自定義代碼,且可以獨(dú)立運(yùn)行在 FaaS 平臺(tái)上。那它有什么特點(diǎn)呢?
- 無需管理服務(wù)器。FaaS 運(yùn)行在第三方云供應(yīng)商提供的平臺(tái)上,程序啟動(dòng),運(yùn)行等管理工作都可交由云供應(yīng)商完成和監(jiān)管。
- 自動(dòng)伸縮。FaaS 是完全自動(dòng),彈性的。意味著可以根據(jù)需要自動(dòng)增加或減少 FaaS 的個(gè)數(shù)。
- 支持HTTP請(qǐng)求?;旧现髁髟破脚_(tái)商都提供由 API Gateway 來觸發(fā) FaaS 函數(shù)。
- 無語言限制。
- 易部署。
- 事件驅(qū)動(dòng)。FaaS 函數(shù)由事件觸發(fā),事件是由云平臺(tái)定義的;類似S3文件/對(duì)象更新,定時(shí)的 Task,Kinesis消息都可以作為事件來觸發(fā) FaaS 函數(shù)。
在使用 FaaS 時(shí),我們還需要注意以下幾點(diǎn):
狀態(tài)
FaaS函數(shù)是無狀態(tài)函數(shù),類似純函數(shù)。這就意味著,你不應(yīng)該將一個(gè)函數(shù)的狀態(tài)用于同一函數(shù)的另一次調(diào)用。如果需要持久化 FaaS 函數(shù)狀態(tài),可借助外部持久化服務(wù)來實(shí)現(xiàn)。
啟動(dòng)延時(shí)
以 AWS lambda 方法為例,當(dāng) Lambda 接收到事件時(shí),它會(huì)經(jīng)歷三個(gè)階段,初始化,調(diào)用,銷毀。在初始化階段,Lambda 會(huì)嘗試解凍之前的執(zhí)行環(huán)境,若沒有可解凍的環(huán)境,Lambda 會(huì)進(jìn)行資源創(chuàng)建,下載函數(shù)代碼,初始化擴(kuò)展和 Runtime,然后開始運(yùn)行代碼。在調(diào)用階段,Lambda 接收事件后開始執(zhí)行函數(shù)。函數(shù)運(yùn)行完成后,Lambda 會(huì)等待下個(gè)事件的調(diào)用。在銷毀階段,如果 Lambda 函數(shù)在一段時(shí)間內(nèi)沒有接收任何調(diào)用,則會(huì)觸發(fā)此階段。在銷毀階段,Runtime 關(guān)閉,然后向每個(gè)擴(kuò)展發(fā)送一個(gè)“銷毀事件”,最后刪除環(huán)境。
觸發(fā) Lambda 時(shí),若當(dāng)前沒有處于激活階段的 Lambda 可供調(diào)用,則 Lambda 會(huì)下載函數(shù)的代碼并創(chuàng)建一個(gè) Lambda 的執(zhí)行環(huán)境。從事件觸發(fā)到新的 Lambda 環(huán)境創(chuàng)建完成這個(gè)周期通常稱為 “冷啟動(dòng)時(shí)間”。
“冷啟動(dòng)”延遲無疑是無可避免的,也是影響用戶體驗(yàn)的重要因素,因此應(yīng)該設(shè)法減少“冷啟動(dòng)”時(shí)間。冷啟動(dòng)延遲取決于許多因素:語言、庫、代碼量、功能環(huán)境、VPC 資源。其中一些可以由開發(fā)人員減少,如選擇輕量化的語言,優(yōu)化代碼量及調(diào)用輕量化的依賴包或sdk。
執(zhí)行時(shí)間
FaaS 函數(shù)通常受限于每次調(diào)用允許運(yùn)行的時(shí)間。目前,AWS Lambda 函數(shù)響應(yīng)事件的“超時(shí)”最多為十五分鐘,然后就會(huì)終止。Microsoft Azure 和 Google Cloud Functions 有類似的限制。
API 網(wǎng)關(guān)
FaaS 函數(shù)作為服務(wù)端應(yīng)用程序,一般由事件觸發(fā),但是對(duì)于大多數(shù)應(yīng)用程序而言,一般是以 HTTP 請(qǐng)求調(diào)用后端 API。因此會(huì)在 FaaS 函數(shù)之前搭載 API gateway。API gateway 會(huì)根據(jù)提前配置好的路由表,將HTTP請(qǐng)求路由到不同的 FaaS 函數(shù)上。
Serverless 架構(gòu)的優(yōu)點(diǎn)
(1) 降低運(yùn)營成本
使用 Serverless 架構(gòu)來構(gòu)建后端應(yīng)用,你不需要花錢請(qǐng)人來管理服務(wù)器、數(shù)據(jù)庫和某些應(yīng)用,與其他人共享基礎(chǔ)設(shè)施(例如硬件、網(wǎng)絡(luò))也會(huì)降低成本。最后由于減少了人工成本,所以你在 Serverless 系統(tǒng)上花費(fèi)的時(shí)間將會(huì)更少。
(2) 降低擴(kuò)展成本
FaaS 函數(shù)的擴(kuò)展和縮減完全是自動(dòng)的,由供應(yīng)商管理,你只需要按訪問流量多少進(jìn)行支付。當(dāng)流量增加時(shí),云平臺(tái)會(huì)自動(dòng)增加FaaS 函數(shù)個(gè)數(shù)來處理激增的請(qǐng)求,這時(shí)候費(fèi)用也會(huì)增加;當(dāng)沒有請(qǐng)求訪問時(shí),平臺(tái)會(huì)減少 FaaS 函數(shù)個(gè)數(shù),因此費(fèi)用也會(huì)減少。
(3) 降低開發(fā)成本
降低開發(fā)成本主要在于使用供應(yīng)商提供的通用型 BaaS 服務(wù),如上面提到的鑒權(quán)服務(wù)和數(shù)據(jù)庫服務(wù),這些服務(wù)只需要支付使用費(fèi)用,不需要再次開發(fā)和維護(hù)。
() 更輕松地運(yùn)營管理
函數(shù)的擴(kuò)展是自動(dòng)的,因此不需要手動(dòng)管理并發(fā)數(shù)量問題。其次 FaaS 打包和部署也非常簡單和快速,這也有效地降低了運(yùn)維時(shí)間和人力成本。
Serverless 架構(gòu)低成本構(gòu)建,比較適合初創(chuàng)公司,其次Serverless 架構(gòu)靈活性(增加和去除某些業(yè)務(wù)功能很方便)適合業(yè)務(wù)變化特別頻繁的公司。最后快速的開發(fā),部署及簡單的運(yùn)營管理特點(diǎn),也讓它擁有更短的上市時(shí)間,幫助企業(yè)更快搶占市場。
Serverless 架構(gòu)缺點(diǎn)
固有缺點(diǎn)
(1) 供應(yīng)商控制和鎖定
供應(yīng)商控制可能會(huì)導(dǎo)致一些問題,例如系統(tǒng)停機(jī)、意外限制、成本變化、功能喪失、強(qiáng)制 API 升級(jí)。當(dāng)切換供應(yīng)商時(shí),可能需要更改代碼、設(shè)計(jì),甚至架構(gòu)。你可以輕松遷移系統(tǒng)的一部分,例如 AWS lambda 函數(shù),但對(duì)于應(yīng)用集成的 Kinesis 或其他組件,每個(gè)云平臺(tái)可能會(huì)有很大不同,這時(shí)候遷移可能需要很多工作量。
(2) 多租戶問題
由于幾個(gè)不同的租戶在同一臺(tái)機(jī)器上運(yùn)行,雖然讓他們覺得自己是唯一使用平臺(tái)的人。但實(shí)際上,他們可能共享相同的基礎(chǔ)設(shè)施,有可能會(huì)導(dǎo)致安全性及性能問題。
(3) 失去服務(wù)的優(yōu)化權(quán)
如果應(yīng)用程序使用了 BaaS 或云平臺(tái)其他的組件(如:Knisis)構(gòu)建服務(wù),那么很難添加定制化的功能在這些服務(wù)或組件里。也就很難針對(duì)客戶需求優(yōu)化或者添加定制功能。
實(shí)現(xiàn)上的缺點(diǎn)
(1) 執(zhí)行時(shí)間
Lambda 函數(shù)有執(zhí)行時(shí)間限制,如果運(yùn)行時(shí)間超過這個(gè)時(shí)間,它將被中止。如果某些業(yè)務(wù)比較復(fù)雜,確實(shí)需要超過十五分鐘的執(zhí)行時(shí)間,那么它將無法使用 Serverless。
(2) “冷啟動(dòng)”延時(shí)
對(duì)于性能要求比較高的業(yè)務(wù),“冷啟動(dòng)”延時(shí)是必要考慮的因素,當(dāng)然也可以通過上述某些手段減少延時(shí)時(shí)間。
(3) 測試和Debug
單元測試并不是什么問題,但是到了集成測試就是個(gè)問題了。FaaS 比其他服務(wù)器代碼小,集成測試更重要。但是在沒有任何云環(huán)境的情況下,很難在本地運(yùn)行并調(diào)試集成測試。對(duì)于本地Debug,可以采用寫單元測試來Debug。因?yàn)榭梢栽趩卧獪y試中mock所有集成的云平臺(tái)模塊,如 Kinesis, IoT client 等。
(4) 監(jiān)控
對(duì)于 Serverless 而言,只能看到供應(yīng)商提供的數(shù)據(jù)及指標(biāo),雖然有些供應(yīng)商會(huì)開放一些接口,讓使用者定制某些指標(biāo),但還是會(huì)受限于供應(yīng)商。