新聞中心
serverless 架構(gòu)簡述
作者:Thoughtworks洞見 2023-06-28 11:55:50
云計算 本文介紹了 Serverless 架構(gòu)概念,優(yōu)缺點,F(xiàn)aaS 相關(guān)概念及特點,希望對你有所幫助。

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


咨詢
建站咨詢
