這個(gè)架構(gòu)能實(shí)現(xiàn)嗎?
近來一直在做一個(gè)產(chǎn)品的架構(gòu)升級,架構(gòu)升級的前期工作是對舊架構(gòu)現(xiàn)存的問題進(jìn)行梳理,考慮新架構(gòu)的設(shè)計(jì)如何規(guī)避舊架構(gòu)的坑,完善舊架構(gòu)支持不佳的缺陷。終于完成了新架構(gòu)設(shè)計(jì),在給開發(fā)工程師講解時(shí),還會遇到開發(fā)的疑惑:新架構(gòu)真能實(shí)現(xiàn)舊架構(gòu)上支持的特別困難或別扭的場景么,如此等等。一個(gè)架構(gòu)從設(shè)計(jì)到實(shí)現(xiàn),到底要做些什么,關(guān)注些什么?
那么我們就從下面這個(gè)問題開始梳理吧。
架構(gòu)做什么
查了下維基百科(Wikipedia)架構(gòu)(Architecture)一詞最早源自建筑學(xué)術(shù)語,后來被計(jì)算機(jī)科學(xué)領(lǐng)域所借用。
架構(gòu)是規(guī)劃、設(shè)計(jì)和構(gòu)建建筑及其物理結(jié)構(gòu)的過程與產(chǎn)物。在計(jì)算機(jī)工程中,架構(gòu)是描述功能、組織和計(jì)算機(jī)系統(tǒng)實(shí)現(xiàn)的一組規(guī)則與方法。
Architecture is both the process and the product of planning, designing, and constructing buildings and other physical structures. In computer engineering, "computer architecture" is a set of rules and methods that describe the functionality, organization, and implementation of computer systems.
要明白做什么,首先需要考慮目標(biāo)是什么?軟件架構(gòu)的目標(biāo)是要設(shè)計(jì)軟件系統(tǒng)來解決問題,所以架構(gòu)要做的事從抽象的維度上看,就是:
- 根據(jù)問題域,界定系統(tǒng)的邊界
- 對系統(tǒng)進(jìn)行切分,切分的目的是分工與協(xié)作(并行,以獲得效率)
- 被切分的各部分之間建立交互與溝通原則與機(jī)制
- 將部分連接合并成一個(gè)整體,完成系統(tǒng)的目標(biāo)
更具體一些來說,架構(gòu)做得就是結(jié)構(gòu)設(shè)計(jì),在不同維度和層次上:
- 高維度:是系統(tǒng)、子系統(tǒng)或服務(wù)的切分與交互結(jié)構(gòu)
- 中維度:是系統(tǒng)或服務(wù)內(nèi)部的模塊劃分
- 低緯度:是代碼結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、表結(jié)構(gòu)
當(dāng)在架構(gòu)升級這樣的事情中,架構(gòu)師的職責(zé)之一是要交付“一種架構(gòu)”,而這“一種架構(gòu)”的載體現(xiàn)在通常又會以某種文檔的形式出現(xiàn)。所以,很容易誤解架構(gòu)師的工作就是寫文檔,實(shí)際上架構(gòu)師的交付成果是一整套決策流,交付載體通常體現(xiàn)成了文檔。在這個(gè)過程中,架構(gòu)師的首要工作就是保證在架構(gòu)方案執(zhí)行中,整個(gè)開發(fā)團(tuán)隊(duì)的實(shí)施效果與決策保持一致。即使在這個(gè)過程發(fā)現(xiàn)了實(shí)施與決策的沖突,就又需要重新協(xié)調(diào)溝通討論以取得新的一致。
當(dāng)系統(tǒng)規(guī)模比較小時(shí),比如架構(gòu)師一個(gè)人就能把全部的設(shè)計(jì)決策在交付期限內(nèi)開發(fā)完成,這就省卻了很多的溝通協(xié)調(diào)討論成本。五年前,我就曾這樣做過一個(gè)小系統(tǒng)的架構(gòu)升級改造,但后來的系統(tǒng)越來越大,慢慢就需要幾十人的團(tuán)隊(duì)來分工協(xié)作,如何保證架構(gòu)設(shè)計(jì)中的決策在架構(gòu)執(zhí)行過程中保持一致,這成為了架構(gòu)工作的真正難點(diǎn)所在。
架構(gòu)關(guān)注點(diǎn)
架構(gòu)設(shè)計(jì)的決策流一旦落在了文檔的載體上,它實(shí)際就是一個(gè)靜態(tài)的東西了。而真正的架構(gòu)執(zhí)行過程卻是動態(tài)的。在這個(gè)動態(tài)過程中,架構(gòu)師需要定期地去對系統(tǒng)的狀態(tài)做快照,觀察是否有出現(xiàn)需要解決的問題,而這些問題就是技術(shù)層面的架構(gòu)關(guān)注點(diǎn)。
一些問題也許是架構(gòu)執(zhí)行中新出現(xiàn)的,在當(dāng)初的架構(gòu)設(shè)計(jì)中未能考慮到,需要對此做分析判斷,并形成新的決策。而另一些問題,也許是執(zhí)行過程中的走樣,導(dǎo)致和當(dāng)初的決策形成了偏差。架構(gòu)師需要考慮所有這些關(guān)注點(diǎn),并和開發(fā)工程師找到解決這些關(guān)注點(diǎn)的各種選項(xiàng),在適當(dāng)?shù)臅r(shí)候根據(jù)真實(shí)環(huán)境的情景去采取合適的行動。有時(shí),我們稱這些行動叫作:重構(gòu)或優(yōu)化。當(dāng)一個(gè)舊系統(tǒng)長期沒有這樣的行動,積累久了后,我們將迫不得已采取另外一種行動,我們稱之為 —— 架構(gòu)升級。
軟件系統(tǒng)或架構(gòu),不像建筑物會因?yàn)闀r(shí)間的流逝而自然耗損腐壞,它只會因?yàn)樽兓瘔摹R婚_始清晰整潔的架構(gòu)與實(shí)現(xiàn)隨著需求的變化而不斷變得渾濁、混亂。信息與計(jì)算機(jī)科學(xué)都愛借用一個(gè)物理學(xué)的術(shù)語「熵」,它表達(dá)體系的混亂程度,而軟件系統(tǒng)的「熵」很容易不經(jīng)意間隨著需求的變化而變得更高。
軟件系統(tǒng)「熵」有個(gè)臨界值,當(dāng)達(dá)到并超過臨界值后,軟件系統(tǒng)的生命也基本到頭了。這時(shí),我們就要采取那個(gè)迫不得已的行動了。圖例展示了軟件系統(tǒng)「熵」值的生命周期變化。
所以,近年流行的微服務(wù)架構(gòu)有個(gè)很大的優(yōu)勢,服務(wù)粒度合適,服務(wù)物理隔離,單個(gè)服務(wù)的「熵」增問題被局限在單個(gè)微服務(wù)內(nèi)部。單個(gè)微服務(wù)的替換與重構(gòu)成本十分有限,使得「熵」增問題局部化,不容易傳染全局,以致失控。當(dāng)然這有個(gè)前提,就是微服務(wù)的拆分和接口交互要合理,合理的檢驗(yàn)標(biāo)準(zhǔn)就是隨需求變化,總是實(shí)現(xiàn)變化或接口新增,而非總是調(diào)整接口交互。
架構(gòu)始于系統(tǒng)生命之初,并伴隨系統(tǒng)生命周期全程。每次需求變化帶來的變動都應(yīng)進(jìn)行一次或大或小的重新架構(gòu)過程。架構(gòu)的關(guān)注點(diǎn)在于控制軟件系統(tǒng)變動時(shí)「熵」值的變化。
架構(gòu)等效性
架構(gòu)升級中一開始的疑惑:這個(gè)新架構(gòu)能實(shí)現(xiàn)么?其實(shí),這根本不是一個(gè)值得疑惑的問題。
相對于建筑架構(gòu),軟件架構(gòu)過程其實(shí)更像是城市的規(guī)劃與演變過程,有一定歷史的城市,慢慢都會演變出所謂的“舊城”和“新城”,新城相對于舊城,就是一次架構(gòu)升級的過程。城市規(guī)劃師會對城市的分區(qū)、功能劃分進(jìn)行重新定位和規(guī)劃。一個(gè)舊城所擁有的所有功能,如:社區(qū)、學(xué)校、醫(yī)院、商業(yè)中心,你難道能想象新城會沒有嗎?或者說“實(shí)現(xiàn)”不了嗎?
所以,如果一個(gè)單體應(yīng)用能實(shí)現(xiàn)的功能,換成微服務(wù)架構(gòu)肯定也可以實(shí)現(xiàn),只是編寫代碼的方式不同。不同架構(gòu)在功能的可實(shí)現(xiàn)性上其實(shí)是完全相同的,我稱之為:架構(gòu)等效性。不同的地方在于哪里呢?如前所述,切分方式不同導(dǎo)致的分工協(xié)作完全不同,因此獲得的效率與付出的成本也會不同。
架構(gòu)升級,僅僅是一次系統(tǒng)的重新布局與規(guī)劃,成本與效率的重新計(jì)算與設(shè)計(jì),熵的重新分布與管理。
【本文是51CTO專欄作者胡峰的原創(chuàng)文章,轉(zhuǎn)載請聯(lián)系作者本人獲取授權(quán)】