“Serverless 能取代微服務(wù)嗎霹琼?” 這是知乎上 Serverless 分類的高熱話題。
有人說微服務(wù)與 Serverless 是相背離的凉当,雖然我們可以基于 Serverless 后端來構(gòu)建微服務(wù)枣申,但在微服務(wù)和 Serverless 之間并不存在直接的路徑。
也有人說看杭,因為 Serverless 內(nèi)含的 Function 可以視為更小的忠藤、原子化的服務(wù),天然地契合微服務(wù)的一些理念楼雹,所以 Serverless 與微服務(wù)是天作之合烘豹。
馬上就要 2021 年了,Serverless 是否終將取代微服務(wù)?從微服務(wù)到 Serverless 需要經(jīng)過怎樣的路徑昌跌? 在我們深入探討細(xì)節(jié)之前,先別急著“站隊”裕坊,不妨先基于你團(tuán)隊的實際情況,真實的去思考是否適合使用微服務(wù),千萬不要因為 "這是趨勢 "而去做選擇得问。
微服務(wù)在 Serverless 中的優(yōu)勢
Serverless
1.可選擇的可擴展性和并發(fā)性
Serverless 讓管理并發(fā)性和可擴展性變得容易膏萧。在微服務(wù)架構(gòu)中曹锨,我們最大限度地利用了這一點。每一個微服務(wù)都可以根據(jù)自己的需求對并發(fā)性/可擴展性進(jìn)行設(shè)置。從不同的角度來看這非常有價值:比如減輕 DDoS 攻擊可能性,降低云賬單失控的財務(wù)風(fēng)險拧抖,更好地分配資源......等等擦盾。
2.細(xì)粒度的資源分配
因為可擴展性和并發(fā)性可以自主選擇腐碱,用戶可以細(xì)粒度控制資源分配的優(yōu)先級芋肠。在 Lambda functions 中吭净,每個微服務(wù)都可以根據(jù)其需求文兢,擁有不同級別的內(nèi)存分配兼呵。比如懂昂,面向客戶的服務(wù)可以擁有更高的內(nèi)存分配铲敛,因為這將有助于加快執(zhí)行時間先鱼;而對于延遲不敏感的內(nèi)部服務(wù)闹蒜,就可以用優(yōu)化的內(nèi)存設(shè)置來進(jìn)行部署。
這一特性同樣適用于存儲機制荣月。比如 DynamoDB 或 Aurora Serverless 數(shù)據(jù)庫就可以根據(jù)所服務(wù)的特定(微)服務(wù)的需求婴程,擁有不同級別的容量分配届搁。
3.松耦合
這是微服務(wù)的一般屬性,并不是 Serverless 的獨有屬性恕齐,這個特性讓系統(tǒng)中不同功能的組件更容易解耦确镊。
4.支持多運行環(huán)境
Serverless 功能的配置、部署和執(zhí)行的簡易性采呐,為基于多個運行時的系統(tǒng)提供了可能性会通。
雖然 Node.js (JavaScript 運行時)是后端 Web 應(yīng)用最流行的技術(shù)之一鹃彻,但它不可能成為每一項任務(wù)的最佳工具笋粟。對于數(shù)據(jù)密集型任務(wù)、預(yù)測分析和任何類型的機器學(xué)習(xí)析蝴,你可能選擇 Python 作為編程語言害捕;像 SageMaker 這樣的專用平臺更適合大項目。
有了 Serverless 基礎(chǔ)架構(gòu)嫌变,你無需在操作方面花費額外的精力就可以直接為常規(guī)后端 API 選擇 Node.js吨艇,為數(shù)據(jù)密集型工作選擇 Python躬它。顯然腾啥,這可能會給你的團(tuán)隊帶來代碼維護(hù)和團(tuán)隊管理的額外工作。
5.開發(fā)團(tuán)隊的獨立性
不同的開發(fā)者或團(tuán)隊可以在各自的微服務(wù)上工作冯吓、修復(fù) bug倘待、擴展功能等,做到互不干擾组贺。比如 AWS SAM凸舵、Serverless 框架等工具讓開發(fā)者在操作層面更加獨立。而 AWS CDK 構(gòu)架的出現(xiàn)失尖,可以在不損害高質(zhì)量和運維標(biāo)準(zhǔn)的前提下,讓開發(fā)團(tuán)隊擁有更高的獨立性。
微服務(wù)在 Serverless 中的劣勢
Serverless
1.難 ****以監(jiān)控和調(diào)試
在 Serverless 帶來的眾多挑戰(zhàn)中勒葱,監(jiān)控和調(diào)試可能是最有難度的共苛。因為計算和存儲系統(tǒng)分散在許多不同的功能和數(shù)據(jù)庫中,更不用說隊列仪吧、緩存等其他服務(wù)了庄新,這些問題都是由微服務(wù)本身引起的。不過,目前已經(jīng)有專業(yè)的平臺可以解決所有這些問題择诈。那么械蹋,專業(yè)的開發(fā)團(tuán)隊是否要引入這些專業(yè)平臺也應(yīng)該基于成本進(jìn)行考量。
2.可能經(jīng)歷更多冷啟動
當(dāng) FaaS 平臺(如 Lambda)需要啟動一個新的虛擬機來運行函數(shù)代碼時羞芍,就會發(fā)生冷啟動哗戈。如果你的函數(shù) Workload 對延遲敏感,就很可能會遇到問題荷科。因為冷啟動會在總啟動時間中增加幾百毫秒到幾秒的時間谱醇,當(dāng)一個請求完成后,F(xiàn)aaS 平臺通常會讓 microVM 空閑一段時間步做,等待下一個請求副渴,然后在 10-60 分鐘后關(guān)閉(是的,變化很大)全度。結(jié)果是:你的功能執(zhí)行的越頻繁煮剧,microVM 就越有可能為傳入的請求而啟動并運行(避免冷啟動)。
當(dāng)我們將應(yīng)用分散在數(shù)百個或數(shù)千個微服務(wù)中時将鸵,我們可能在每個服務(wù)中分散調(diào)用時間勉盅,導(dǎo)致每個函數(shù)的調(diào)用頻率降低。注意 “可能會分散調(diào)用”顶掉。根據(jù)業(yè)務(wù)邏輯和你的系統(tǒng)行為方式草娜,這種負(fù)面影響可能很小,或者可以忽略不計痒筒。
3.其 ****他缺點
微服務(wù)概念本身還存在其他固有的缺點宰闰。這些并不是與 Serverless 有內(nèi)在聯(lián)系的。盡管如此簿透,每一個采用這種類型架構(gòu)的團(tuán)隊都應(yīng)該謹(jǐn)慎移袍,以降低其潛在的風(fēng)險和成本。
確定服務(wù)邊界并非易事老充,可能會招致架構(gòu)問題葡盗。
更廣泛的攻擊面
服務(wù)編排費用問題
同步計算和存儲(在需要的時候)是不容易做到高性能和可擴展
微服務(wù)在 Serverless 中的挑戰(zhàn)和實踐
Serverless
1.Serverless 中微服務(wù)應(yīng)該多大?
人們在理解 Servrless 時啡浊," Function as a Services(FaaS) " 的概念很容易與編程語言中的函數(shù)語句相混淆觅够。目前,我們正在處在一個沒有辦法劃出完美界限的時期巷嚣,但經(jīng)驗表明喘先,使用非常小的 Serverless 函數(shù)并不是一個好主意。
當(dāng)你決定將一個(微)服務(wù)分拆成獨立的功能時涂籽,你就將不得不面對 Serverless 難題苹祟。因此,在此提醒,只要有可能树枫,將相關(guān)的邏輯保持在一個函數(shù)中會好很多直焙。
當(dāng)然,決策過程也應(yīng)該考慮擁有一個獨立的微服務(wù)的優(yōu)勢
你可以這樣設(shè)想:“如果我把這個微服務(wù)分拆出來......”
它能讓不同的團(tuán)隊獨立工作嗎砂轻?
能否從細(xì)粒度的資源分配或選擇性的擴展能力中獲益奔誓?
如果不能,你應(yīng)該考慮將這個服務(wù)與另一個需要類似資源搔涝、上下文關(guān)聯(lián)并執(zhí)行相關(guān) Workload 的服務(wù)捆綁在一起厨喂。
2.松耦合的架構(gòu)
通過組成 Serverless 函數(shù)來協(xié)調(diào)微服務(wù)的方法有很多。
當(dāng)需要同步通信時庄呈,可以直接調(diào)用(即 AWS Lambda RequestResponse 調(diào)用方法)蜕煌,但這會導(dǎo)致高度耦合的架構(gòu)。更好的選擇是使用 Lambda Layers 或 HTTP API诬留,這樣可以讓以后的修改或遷移服務(wù)對客戶端不構(gòu)成影響斜纪。
對于接受異步通信模型,我們有幾種選擇文兑,如隊列(SQS)盒刚、主題通知(SNS)、Event Bridge 或者 DynamoDB Streams绿贞。
3.跨組件隔離
理想情況下因块,微服務(wù)不應(yīng)向使用者暴露細(xì)節(jié)。像 Lambda 這樣的 Serverless 平臺會提供一個 API 來隔離函數(shù)籍铁。但這本身就是一種實現(xiàn)細(xì)節(jié)的泄露涡上,理想情況下,我們會在函數(shù)之上添加一個不可知的 HTTP API 層寨辩,使其真正隔離吓懈。
4.使用并發(fā)限制和節(jié)流策略的重要性
為了減輕 DDoS 攻擊歼冰,在使用 AWS API Gateway 等服務(wù)時靡狞,一定要為每個面向公眾的終端設(shè)置單獨的并發(fā)限制和節(jié)流策略。這類服務(wù)一般在云平臺中會為整個區(qū)域設(shè)置全局并發(fā)配額隔嫡。如果你沒有基于端點的限制甸怕,攻擊者只需要將一個單一的端點作為攻擊目標(biāo),就可以耗盡你的配額腮恩,并讓你在該區(qū)域的整個系統(tǒng)癱瘓梢杭。
推薦閱讀
看完三件事??
如果你覺得這篇內(nèi)容對你還蠻有幫助秸滴,我想邀請你幫我三個小忙:
點贊武契,轉(zhuǎn)發(fā),有你們的 『點贊和評論』,才是我創(chuàng)造的動力咒唆。
關(guān)注公眾號 『 Java斗帝 』届垫,不定期分享原創(chuàng)知識。
同時可以期待后續(xù)文章ing??