過去一年中,Deliveroo在商業(yè)和IT領(lǐng)域成長迅速,這導(dǎo)致它的大型單體應(yīng)用面對不少的技術(shù)挑戰(zhàn)。Greg Beech在近期的QCon倫敦大會演講中指出,Deliveroo對此問題的解決方案并非依靠微服務(wù),而是向分布式轉(zhuǎn)變。Beech介紹了Deliveroo在從單體應(yīng)用轉(zhuǎn)變?yōu)榉植际较到y(tǒng)過程中的一些做法。
Deliveroo公司創(chuàng)立于2013年,Beech現(xiàn)任公司的首席工程師。公司起步于采用傳統(tǒng)Ruby on Rails開發(fā)的單體應(yīng)用,數(shù)據(jù)存儲使用了PostgreSQL和Redis,通過不斷增大數(shù)據(jù)庫規(guī)模而處理日益增長的業(yè)務(wù)。一年前,他們需要運行大約20臺Heroku托管服務(wù)器。當(dāng)前運行的服務(wù)器規(guī)模達(dá)數(shù)百臺,這已成為Keroku上部署的最大規(guī)模應(yīng)用,峰值情況下需要使用1800個內(nèi)核和3TB的內(nèi)存。公司由2015年的10名工程師已成長為2017年的近100名工程師,主代碼庫中的有效代碼行達(dá)到約60萬行。
采用單體程序架構(gòu)是一個經(jīng)過深思熟慮的決策,他們因此可以快速添加適合市場需求的特性,但是現(xiàn)在這種架構(gòu)需要面對一些問題。由于當(dāng)前單體程序的規(guī)模增長得很大,Deliveroo受困于性能下降和構(gòu)建時間增加的問題,構(gòu)建時間已經(jīng)從兩年前的7分鐘左右增加到目前的兩個小時左右,進(jìn)而延緩了開發(fā)的速度。大型單體程序也會導(dǎo)致可靠性下降,因為出現(xiàn)一個問題就可能使得所有的服務(wù)宕機。
Deliveroo的解決方案是轉(zhuǎn)向分布式,實現(xiàn)中采用了一種將單體程序切分為三大類“十二要素”(Twelve-Factor)應(yīng)用的方法。這三類應(yīng)用分別是領(lǐng)域服務(wù)(Domain service)、外圍服務(wù)(Edge service)和客戶端應(yīng)用(Client apps for the UI),事件總線為這些服務(wù)提供了支持。
領(lǐng)域服務(wù)是:
占有領(lǐng)域的重要部分。這些服務(wù)占有了領(lǐng)域的重要部分,這些部分只有緊密粘合在一起才具有作用。這就是Beech不喜歡稱其為微服務(wù)的原因所在。 暴露內(nèi)部真實的REST API,包括超媒體。 從事件總線收發(fā)事件。 可以使用其它域服務(wù)的API。外圍服務(wù)是:
不具有任何一部分領(lǐng)域。 向外部暴露聚合的API。 從事件總線接收事件。 可以使用其它外圍服務(wù)和領(lǐng)域服務(wù)的API。在這種分布式解決方案中,不存在共享的數(shù)據(jù)存儲。每個應(yīng)用都具有自身的數(shù)據(jù)存儲,除非存在例外情況,否則每個應(yīng)用的數(shù)據(jù)存儲是不能被其它的應(yīng)用訪問的。此外,所有數(shù)據(jù)是作為REST API方式暴露的,Beech指出這是真正包含超媒體的REST。舉個例子,API返回的集合(Collection Resource)是一系列到實體的鏈接,而非內(nèi)嵌的對象。他同時指出,RPC是不允許使用的。
在創(chuàng)建、更新或刪除實體后,領(lǐng)域服務(wù)會通過事件總線發(fā)送事件,他們將這種技術(shù)稱為“呈現(xiàn)狀態(tài)通知”(RSN,Representational State Notification)。事件中從不包含載體,只是鏈接到事件相關(guān)實體。這樣做的部分原因是出于避免總線成為數(shù)據(jù)損失的一個關(guān)鍵源頭。但是一些非關(guān)鍵的不可變值對象是可以在消息中發(fā)送的,這是一種例外情況。
Beech指出雖然Deliveroo對于服務(wù)如何構(gòu)建、如何分層及如何通信給出了相當(dāng)強有力的指南,但依然可以從簡單處著手,按自己需要去演化成一個更為復(fù)雜的架構(gòu)。這樣做的目的在于,允許團隊就像具有自身問題切入點和目標(biāo)的初創(chuàng)公司那樣運行,按團隊需求演化自身的架構(gòu),并在分布式架構(gòu)經(jīng)驗有限的條件下取得成功。
查看英文原文: Moving Deliveroo from a Monolith to a Distributed System