Serverless和EDA與亞馬遜云科技,讓整個(gè)系統(tǒng)變成松耦合的狀態(tài)
前一段有個(gè)很火的博客,講的是一家全球流媒體企業(yè)的監(jiān)測(cè)系統(tǒng)從Serverless+微服務(wù)改成了單體,成本居然降低了90%!這一下子可在網(wǎng)上炸鍋了,特別是一些看不慣微服務(wù)的、單體應(yīng)用的擁躉,更是坐不住了。但這并不像吃瓜群眾看到的那樣,僅僅是“回歸”單體應(yīng)用,或者說(shuō)大家的關(guān)注點(diǎn)都盯著那個(gè)成本降低了90%。
大部分人忽略了兩件事情:
(1)架構(gòu)的演進(jìn)
(2)Serverless First
?
架構(gòu)的演進(jìn)
視頻監(jiān)控系統(tǒng)最早版本確實(shí)選擇了分布式的架構(gòu),主要包含三個(gè)組件:
1. 媒體轉(zhuǎn)換服務(wù):把視頻轉(zhuǎn)換成“幀”,保存在Amazon S3中。
2. 缺陷檢測(cè)服務(wù):分析Amazon S3中的視頻“幀”,檢查是否有缺陷。
3. 通知服務(wù):發(fā)現(xiàn)了視頻缺陷,發(fā)送實(shí)時(shí)通知。
?

這個(gè)架構(gòu)的好處是:充分利用了亞馬遜云科技的基礎(chǔ)設(shè)施。Amazon S3幫助進(jìn)行數(shù)據(jù)在多個(gè)服務(wù)之間進(jìn)行中轉(zhuǎn),Amazon Step Functions幫助對(duì)多個(gè)服務(wù)進(jìn)行組合和協(xié)調(diào)。在Serverless的加持下,每個(gè)組件都可以根據(jù)流量獨(dú)立地、自動(dòng)地?cái)U(kuò)展。
這個(gè)架構(gòu)非常簡(jiǎn)單,但簡(jiǎn)單的架構(gòu)不一定是單體架構(gòu),也可能是Serverless架構(gòu),因?yàn)閬嗰R遜云科技把復(fù)雜的細(xì)節(jié)都給封裝起來(lái)了,程序員可以專注業(yè)務(wù)的開發(fā),可以快速實(shí)現(xiàn),快速進(jìn)入市場(chǎng)。
但是當(dāng)流量大了以后,這個(gè)架構(gòu)暴露出了兩個(gè)問(wèn)題:
(1)?服務(wù)粒度拆分得太細(xì),使用Amazon Step Functions組合起來(lái)以后,導(dǎo)致狀態(tài)遷移次數(shù)過(guò)多,收費(fèi)自然就高了。
(2)?使用Amazon S3來(lái)暫存視頻幀,對(duì)數(shù)據(jù)的存取需要一定的費(fèi)用,當(dāng)視頻流數(shù)量很大時(shí),費(fèi)用也就相應(yīng)上升了。
很明顯,原有的微服務(wù)架構(gòu)已經(jīng)不滿足需求了,必須進(jìn)行演進(jìn)。團(tuán)隊(duì)的選擇是:把所有的服務(wù)都放到一個(gè)進(jìn)程中,部署到一個(gè)Amazon ECS中,數(shù)據(jù)的通信不再使用Amazon S3,而是直接用Amazon?ECS的內(nèi)存。既然在一個(gè)進(jìn)程中,Amazon Step Functions也就不需要了,狀態(tài)轉(zhuǎn)換帶來(lái)的費(fèi)用也就沒(méi)有了。
當(dāng)一個(gè)Amazon ECS不夠用,需要擴(kuò)展的時(shí)候,可以部署多個(gè)Amazon ECS。用這種方式,成本降低了90%。
但是很多人沒(méi)意識(shí)到的是,這里只是運(yùn)行成本降低了90%,開發(fā)成本并沒(méi)有算進(jìn)去。原來(lái)系統(tǒng)用的是Amazon Step Functions,在把微服務(wù)架構(gòu)轉(zhuǎn)換成單體的過(guò)程中,自然是不用了,但是Amazon Step Functions承擔(dān)的協(xié)調(diào)功能怎么辦呢?它內(nèi)置的重試功能、異常捕獲功能怎么辦呢?如果出現(xiàn)未處理的異常、運(yùn)行超時(shí)、Socket超時(shí)等問(wèn)題該怎么辦呢?
這些問(wèn)題都需要程序員手工來(lái)重新編碼實(shí)現(xiàn)!
此外使用單體架構(gòu),失去了原來(lái)Serverless自然擁有的橫向擴(kuò)展的能力,想根據(jù)流量對(duì)特定微服務(wù)進(jìn)行擴(kuò)展是不可能了,現(xiàn)在擴(kuò)展的最小單位變成了Amazon?ECS,并且團(tuán)隊(duì)不得不自己去估算流量,編程實(shí)現(xiàn)請(qǐng)求在多個(gè)Amazon?ECS之間的轉(zhuǎn)發(fā)。
架構(gòu)設(shè)計(jì)本質(zhì)上是一種權(quán)衡(Trade-Off),不可能存在一種面面俱到的完美架構(gòu),一勞永逸地解決問(wèn)題,架構(gòu)師的工作就是不斷地取舍,根據(jù)需求不斷演進(jìn)架構(gòu),找到最適合自己的。
這個(gè)監(jiān)控系統(tǒng)的架構(gòu)就是一個(gè)演進(jìn)的過(guò)程,從微服務(wù)+Serverless開始,最后由于基于成本的考慮,轉(zhuǎn)換為單體,自己實(shí)現(xiàn)擴(kuò)展,自己管理基礎(chǔ)設(shè)施,自己開發(fā)部分代碼。亞馬遜的CTO Werner說(shuō):構(gòu)建可演進(jìn)的軟件系統(tǒng)是一種策略,必須用開放的心態(tài)來(lái)重新審視你的架構(gòu)。
?
Serverless First
綜上所述,Prime Video監(jiān)控系統(tǒng)這個(gè)案例,實(shí)際上就是架構(gòu)演進(jìn)的自然結(jié)果?,F(xiàn)在如果你要構(gòu)建一個(gè)新的應(yīng)用,不要做某種架構(gòu)的狂熱信徒,不能說(shuō)這個(gè)就好,那個(gè)就不好,一切都視情況而定,先保持簡(jiǎn)單,然后再慢慢演進(jìn)。但是建議大家:一定要有Serverless First的心態(tài)。
原因非常簡(jiǎn)單,使用Serverless,可以拋棄基礎(chǔ)設(shè)施維護(hù)的負(fù)擔(dān),把注意力集中在業(yè)務(wù)實(shí)現(xiàn)上,在幾天或者幾周內(nèi)快速構(gòu)建一個(gè)系統(tǒng),推向市場(chǎng)并且獲得收益。Serverless是真正地按價(jià)值付費(fèi),用戶使用了你開發(fā)的產(chǎn)品,才會(huì)產(chǎn)生費(fèi)用,如果沒(méi)有流量,根本不會(huì)產(chǎn)生費(fèi)用。
當(dāng)業(yè)務(wù)取得成功,有持續(xù)穩(wěn)定的流量,對(duì)云上成本很敏感,愿意自己維護(hù)基礎(chǔ)設(shè)施,可以接受增加部分開發(fā)工作,這個(gè)時(shí)候可以考慮進(jìn)行一些架構(gòu)調(diào)整,比如將工作負(fù)載轉(zhuǎn)向容器。這是一種市場(chǎng)導(dǎo)向,業(yè)務(wù)導(dǎo)向的方法,也是一種更加敏捷的方法。如果在設(shè)置虛擬機(jī),容器,軟件等方面花費(fèi)太多的金錢和精力,最后發(fā)現(xiàn)產(chǎn)品不是市場(chǎng)所需要的,那將是一種巨大的浪費(fèi)。
Serverless和EDA(事件驅(qū)動(dòng)架構(gòu))是絕配,當(dāng)你采用它們的時(shí)候,會(huì)迫使你不斷思考,把整個(gè)系統(tǒng)變成松耦合的狀態(tài),讓系統(tǒng)中每個(gè)組件都更加獨(dú)立,互不影響。這也是良好的設(shè)計(jì)要達(dá)到的目標(biāo)之一。
即使將來(lái)要“回歸”到單體,或者整個(gè)系統(tǒng)一部分用微服務(wù),一部分用單體,之前絕大部分組件代碼都可以重用,就像視頻監(jiān)控系統(tǒng)那樣,你要做的只是把這些組件放入到一個(gè)進(jìn)程,一個(gè)Container中,然后手工編碼補(bǔ)充完善那些本來(lái)由Serverless內(nèi)置提供的能力。如果反過(guò)來(lái),一開始系統(tǒng)不是松耦合的,再想變成微服務(wù)和Serverless,那拆分的代價(jià)將會(huì)非常之高。
?
總結(jié)
視頻監(jiān)控系統(tǒng)這個(gè)案例的討論是很有價(jià)值的,它給我們敲響了警鐘,并不是微服務(wù)不行,Serverless不行,而是要在合適的時(shí)間點(diǎn),選擇合適的架構(gòu)。
現(xiàn)代應(yīng)用的架構(gòu)設(shè)計(jì)要有Serverless First的心態(tài),不要過(guò)多考慮基礎(chǔ)設(shè)施,而是把注意力集中在業(yè)務(wù)實(shí)現(xiàn)上,迅速推出產(chǎn)品和服務(wù),然后再根據(jù)實(shí)際需求進(jìn)行調(diào)整,從而實(shí)現(xiàn)業(yè)務(wù)價(jià)值的最大化。