国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

幫助中心 >  行業(yè)資訊 >  架構(gòu) >  架構(gòu)設(shè)計(jì)六小原則

架構(gòu)設(shè)計(jì)六小原則

2020-09-04 16:45:11 9239

架構(gòu)設(shè)計(jì)六小原則

計(jì)算機(jī)軟件是一個(gè)復(fù)雜的系統(tǒng)。復(fù)雜的系統(tǒng)總是似而不同,在宏觀上類似,在細(xì)節(jié)的地方各有千秋。因?yàn)榧?xì)節(jié)決定成敗,復(fù)雜的系統(tǒng)很難有屢試不爽的解法。盡管如此,解決的多了也會(huì)遺留一些經(jīng)驗(yàn)。這些經(jīng)驗(yàn)再加以重復(fù)驗(yàn)證就形成了原則。這些原則有其特殊的歷史背景,不一定放之四海而皆準(zhǔn)。但是不聽老人言,吃虧在眼前,在能自行頓悟之前建議能熟誦于胸,以防不測(cè)。

 

架構(gòu)六則

  1、 狀態(tài)多具象,讀寫本不同。

   2、狀態(tài)常遷移,一致有成本。

   3、優(yōu)化守本分,變化相對(duì)論。

   4、 熟誦六小計(jì),錦囊隨身行。

 

 

狀態(tài)多具象

 

計(jì)算機(jī)數(shù)據(jù)分為正源和衍生兩種。正源數(shù)據(jù)指的是官方欽定的最原始的數(shù)據(jù),所以有時(shí)候也叫原始數(shù)據(jù)。衍生數(shù)據(jù)是基于正源數(shù)據(jù)派生而來,對(duì)正源數(shù)據(jù)進(jìn)行二次加工,是對(duì)正源數(shù)據(jù)的一個(gè)特殊的視角。常見的衍生數(shù)據(jù)生成方式有篩選、聚合、統(tǒng)計(jì)等等。有一些數(shù)據(jù)屬于衍生數(shù)據(jù),但是并不那么直觀。一個(gè)例子是數(shù)據(jù)庫索引。數(shù)據(jù)庫索引是為了加速數(shù)據(jù)查詢而生成的特殊數(shù)據(jù)結(jié)構(gòu),是由數(shù)據(jù)庫表衍生出來的一份數(shù)據(jù)。另一個(gè)例子是網(wǎng)頁前端界面顯示。一般的網(wǎng)頁前端界面顯示的流程是這樣的:

1、后端服務(wù)器生成業(yè)務(wù)數(shù)據(jù)。 

2、業(yè)務(wù)數(shù)據(jù)變成與前端通訊的格式,比如json、xml等,通過網(wǎng)絡(luò)協(xié)議發(fā)送至網(wǎng)頁瀏覽器。

3、網(wǎng)頁代碼將數(shù)據(jù)變成特定的瀏覽器Javascript對(duì)象。

4、瀏覽器將Javascript對(duì)象變?yōu)橛?jì)算機(jī)顯卡能識(shí)別的數(shù)據(jù)。

5、顯卡在顯示器上展示數(shù)據(jù)。

 

以上每一步流程都是數(shù)據(jù)的處理和加工過程。從每個(gè)加工組件的角度來看,輸入是正源數(shù)據(jù),輸出是衍生數(shù)據(jù)。從上到下完整的來看,后端服務(wù)器上的是正源數(shù)據(jù),其余數(shù)據(jù)都是衍生而來。

 

判斷數(shù)據(jù)是正源還是衍生的辦法很簡(jiǎn)單:如果數(shù)據(jù)不見了,是否能夠基于其它數(shù)據(jù)重新生成出來。比如前面提到的數(shù)據(jù)庫索引數(shù)據(jù)。數(shù)據(jù)庫有索引的刪除和表的索引重建操作,表刪除了就沒有了,所以索引是衍生數(shù)據(jù),數(shù)據(jù)庫表是正源數(shù)據(jù)。對(duì)于網(wǎng)頁顯示的例子,瀏覽器刷新之后,網(wǎng)頁顯示會(huì)先消失然后重新展示出來,但是如果后端服務(wù)器宕機(jī)就沒辦法再展示網(wǎng)頁了。所以前端顯示是衍生數(shù)據(jù),后端數(shù)據(jù)是正源數(shù)據(jù)。

 

 

在架構(gòu)設(shè)計(jì)中,因?yàn)檠苌鷶?shù)據(jù)可以基于正源數(shù)據(jù)重復(fù)產(chǎn)生,衍生數(shù)據(jù)的容災(zāi)度較高,恢復(fù)的方法較多。相對(duì)而言正源數(shù)據(jù)只有一份,損壞之后無法輕易恢復(fù),因此需要針對(duì)業(yè)務(wù)對(duì)容災(zāi)的需求進(jìn)行精心的設(shè)計(jì)。

 

1.讀寫本不同

 

對(duì)于每個(gè)人來說,讀是一個(gè)內(nèi)容輸入的過程,寫是一個(gè)內(nèi)容輸出的過程。一般會(huì)認(rèn)為這是兩種不同的個(gè)人能力,不一定同時(shí)都很優(yōu)秀或者都不優(yōu)秀,比如有人可能閱讀能力強(qiáng)但是寫作能力弱,也有可能寫作能力強(qiáng)但是閱讀能力弱。同理,計(jì)算機(jī)的讀寫也是兩個(gè)不同的行為。計(jì)算機(jī)的讀和寫的對(duì)象都是數(shù)據(jù),但是讀操作是數(shù)據(jù)的輸入過程,寫操作是數(shù)據(jù)的輸出過程。這里提到的讀寫本不同的第一個(gè)不同點(diǎn)在于操作的不同。數(shù)據(jù)的輸入和輸出可能會(huì)面臨不同的吞吐量、延時(shí)、容災(zāi)等需求,需要分別對(duì)待。

 

讀寫本不同的第二個(gè)不同點(diǎn)非常難以發(fā)覺,那就是數(shù)據(jù)有可能也是不同的。在狀態(tài)多具象一節(jié)里我們介紹了數(shù)據(jù)分為正源數(shù)據(jù)和衍生數(shù)據(jù)兩大類。之所以會(huì)有衍生數(shù)據(jù)的一個(gè)原因是數(shù)據(jù)的使用,即數(shù)據(jù)的讀取,可能需要有特殊的優(yōu)化方式。為了讀性能的原因需要對(duì)正源數(shù)據(jù)做一些預(yù)處理,比如建索引。所以對(duì)于數(shù)據(jù)庫的例子來說寫的數(shù)據(jù)是正源數(shù)據(jù),讀的數(shù)據(jù)是衍生數(shù)據(jù),所以讀寫的操作是有可能基于兩份不同的數(shù)據(jù)進(jìn)行的。

 

總結(jié)一下。讀寫的不同在于讀寫的數(shù)據(jù)不同以及數(shù)據(jù)的流向不同。在架構(gòu)設(shè)計(jì)時(shí)需要將讀寫分開考慮,分開優(yōu)化。

 

2.狀態(tài)常遷移

 

計(jì)算機(jī)程序會(huì)用到一些數(shù)據(jù)結(jié)構(gòu),比如List,Map,Set等等。在面向?qū)ο缶幊痰倪^程中還會(huì)使用到類的對(duì)象。這些數(shù)據(jù)結(jié)構(gòu)和對(duì)象其實(shí)都是一種狀態(tài),計(jì)算機(jī)程序需要正確合理的維護(hù)這些狀態(tài)。

 

通常這些狀態(tài)都是在內(nèi)存之中,機(jī)器一旦斷電就會(huì)全部消失。所以需要將這些內(nèi)存信息保存到可持久化的存儲(chǔ)介質(zhì)上,比如硬盤和網(wǎng)絡(luò)存儲(chǔ)。這個(gè)保存的過程其實(shí)是內(nèi)存狀態(tài)的遷移過程。但是硬盤也會(huì)出現(xiàn)機(jī)械故障,造成數(shù)據(jù)丟失。因此更為穩(wěn)妥的方法是不要將雞蛋放在一個(gè)籃子里,將硬盤的數(shù)據(jù)再備份到其它的地方。這個(gè)數(shù)據(jù)備份的過程也是狀態(tài)的遷移過程。

 

除了解決數(shù)據(jù)丟失的問題需要狀態(tài)遷移以外,狀態(tài)遷移也會(huì)被用來解決物理局限。一臺(tái)機(jī)器內(nèi)存的大小是有限的,所以當(dāng)內(nèi)存里的數(shù)據(jù)大到裝不下的時(shí)候,需要將內(nèi)存里的數(shù)據(jù)分散到其它機(jī)器上,這些機(jī)器作為一組集群提供一個(gè)分布式的數(shù)據(jù)結(jié)構(gòu)。一臺(tái)機(jī)器的硬盤大小也是有上限的,同理,當(dāng)硬盤不夠時(shí)也可以將硬盤數(shù)據(jù)分散到由一組集群組成的分布式文件系統(tǒng)里。對(duì)于應(yīng)用程序來說,它還是在通過同樣的接口訪問數(shù)據(jù)結(jié)構(gòu)或者文件系統(tǒng),只不過這些內(nèi)容可能分散在了網(wǎng)絡(luò)上的其它機(jī)器。

 

3.一致有成本

 

前面提到了狀態(tài)常遷移。如果遷移過程中數(shù)據(jù)出了問題怎么辦?比如在數(shù)據(jù)備份過程中網(wǎng)線斷了,或者數(shù)據(jù)中心停電了。這時(shí)候需要有一套應(yīng)急措施來保證在基礎(chǔ)架構(gòu)恢復(fù)之后再次啟動(dòng)數(shù)據(jù)備份流程。數(shù)據(jù)的重發(fā)是一種成本。

 

數(shù)據(jù)的全部丟失比較容易處理,相對(duì)挑戰(zhàn)高一點(diǎn)的是數(shù)據(jù)部分丟失。比如在數(shù)據(jù)傳輸過程中掉了部分?jǐn)?shù)據(jù),或者由于宇宙射線的影響導(dǎo)致賬戶金額由正變負(fù)。這時(shí)候除了需要有數(shù)據(jù)重發(fā)功能以外還需要有數(shù)據(jù)正確性驗(yàn)證的功能。數(shù)據(jù)的正確性驗(yàn)證也是一種成本。

 

在分布式系統(tǒng)中還有一些更為復(fù)雜的情況。比如我們將數(shù)據(jù)備份至北上廣三個(gè)數(shù)據(jù)中心。當(dāng)我們剛發(fā)出最新的數(shù)據(jù)備份指令的時(shí)候本地?cái)?shù)據(jù)中心掉電,完全停止工作。這時(shí)候我們需要在北上廣三個(gè)數(shù)據(jù)中心中選擇一個(gè)來做業(yè)務(wù)的實(shí)時(shí)切換。那么我們?cè)趺磁袛噙x擇出來的數(shù)據(jù)中心有最新的數(shù)據(jù)呢?這個(gè)問題的難點(diǎn)在于我們需要判斷某些數(shù)據(jù)和一個(gè)無法訪問的數(shù)據(jù)是否一致。這個(gè)問題的解決需要數(shù)據(jù)的發(fā)送方和接收方一起通過既定的分布式協(xié)議來解決。

 

我們也可以把問題簡(jiǎn)化一點(diǎn)。假設(shè)我們不需要判斷北上廣是否有最新的數(shù)據(jù),我們只要選擇當(dāng)中數(shù)據(jù)最多的一個(gè)就可以了。顯然可以嘗試通過兩兩比較的方式來判斷誰的數(shù)據(jù)更多。但是如果在比較的過程中網(wǎng)絡(luò)出現(xiàn)了隔斷,比如上海的數(shù)據(jù)中心成為了一個(gè)被隔離的信息孤島,這時(shí)該如何處理呢?分布式系統(tǒng)中還有更為少見的單向通訊故障,一般是在防火墻出現(xiàn)錯(cuò)誤配置的時(shí)候會(huì)出現(xiàn)。假設(shè)北京可以訪問上海數(shù)據(jù),上??梢栽L問廣州數(shù)據(jù),廣州可以訪問北京數(shù)據(jù),但是上海不可以訪問北京,廣州不可以訪問上海,北京不可以訪問廣州。這時(shí)每個(gè)數(shù)據(jù)中心都知道剩下兩個(gè)數(shù)據(jù)中心的一個(gè)信息,但是不知道另一個(gè)的信息。這時(shí)候應(yīng)該怎么判斷誰的信息更全面呢?這也需要分布式協(xié)議來解決。

 

更為悲觀的是理論科學(xué)家證明了在一定假設(shè)情況下,只要網(wǎng)絡(luò)集群有一個(gè)節(jié)點(diǎn)有可能出現(xiàn)故障,整個(gè)集群便不可能達(dá)到一致。這就是著名的FLP結(jié)論。我們會(huì)在之后詳細(xì)講解這個(gè)定理。因?yàn)闄C(jī)器會(huì)出故障,所以一致性的解決就不是成本高低的問題,而是不可能解決的問題了,換句話說想要達(dá)到一致性的成本是無限高。

 

所幸在實(shí)際操作過程中FLP論文中提到的假設(shè)是很容易通過一些方法來規(guī)避的,架構(gòu)師還是有可能設(shè)計(jì)出一個(gè)具有一致性的軟件架構(gòu)。這也表明一致性的解決還有一個(gè)很高的學(xué)習(xí)成本。

 

4.優(yōu)化守本分

 

如章首所引,提前優(yōu)化是萬惡之源。不提前的優(yōu)化也需要注意。每個(gè)程序都有既定的功能,這就是在軟件工程里提到的功能性需求。程序還有一些對(duì)于運(yùn)行效率相關(guān)的要求,比如吞吐量、響應(yīng)時(shí)間等。這些的學(xué)名叫非功能性需求。優(yōu)化是會(huì)改變程序的行為,但是這種改變只能影響非功能性需求,不能影響功能性需求。這是優(yōu)化的一道紅線,不能僭越。優(yōu)化守本分就是要守住這根紅線。

 

在實(shí)際過程中會(huì)出現(xiàn)無論怎么優(yōu)化,非功能性需求都無法達(dá)到的情況,比如需要達(dá)到非常高的吞吐量。這時(shí)候會(huì)通過放棄一些業(yè)務(wù)的要求來簡(jiǎn)化系統(tǒng)實(shí)現(xiàn)。常見的方法有最終一致性、事務(wù)補(bǔ)償?shù)?。這時(shí)候同時(shí)出現(xiàn)了系統(tǒng)優(yōu)化和功能改變,但由于功能改變是因,系統(tǒng)優(yōu)化是果,因果關(guān)系不同,并沒有違反原則。

 

5.變化相對(duì)論

 

辯證唯物主義認(rèn)為,事物的運(yùn)動(dòng)發(fā)展是變與不變的統(tǒng)一。顯然變與不變的相對(duì)關(guān)系是一個(gè)偏哲學(xué)的問題。由于我們是介紹實(shí)踐為主,不深入做理論分析,所以在這里不做過多的闡述,只舉幾個(gè)例子。

 

一個(gè)例子是關(guān)系型數(shù)據(jù)庫的查詢。關(guān)系型數(shù)據(jù)庫訪問的方法一般是通過SQL結(jié)構(gòu)化查詢語句。不同人會(huì)有不同的查詢內(nèi)容和方式。在這種場(chǎng)景下數(shù)據(jù)庫里的數(shù)據(jù)是相對(duì)不變的,SQL查詢語句是變化的。但是隨著互聯(lián)網(wǎng)的發(fā)展,人們對(duì)查詢結(jié)果的實(shí)時(shí)性要求越來越高。比如在大型的搜索網(wǎng)站、電商或者新聞網(wǎng)站的搜索界面,當(dāng)輸入一個(gè)查詢條件之后,網(wǎng)站會(huì)不斷的推送最新的查詢結(jié)果。在這種情況下查詢語句是不變的,數(shù)據(jù)是變化的。數(shù)據(jù)和查詢?cè)谶@兩種情況下的實(shí)現(xiàn)也不相同。在傳統(tǒng)關(guān)系型數(shù)據(jù)庫的情況下,為了加快查詢結(jié)果,數(shù)據(jù)庫會(huì)對(duì)表建立索引。在實(shí)時(shí)查詢結(jié)果推送的情況下,數(shù)據(jù)系統(tǒng)會(huì)對(duì)查詢語句做索引。

 

另一個(gè)例子是對(duì)數(shù)據(jù)的操作。金融數(shù)據(jù)和所有數(shù)據(jù)一樣,一旦修改就變化的和以前不一樣了。這樣金融行業(yè)的審計(jì)人員怎么知道幾個(gè)月或者幾年前數(shù)據(jù)是怎樣的呢?一般為了應(yīng)付審計(jì),系統(tǒng)開發(fā)人員會(huì)在審計(jì)周期開始時(shí)做一個(gè)全量的數(shù)據(jù)拷貝,并將訪問權(quán)限設(shè)為只讀。這樣就有了一個(gè)不變的數(shù)據(jù)版本。這種設(shè)計(jì)下數(shù)據(jù)是一直在變化的。另一種系統(tǒng)設(shè)計(jì)的思路稍有不同。對(duì)數(shù)據(jù)的修改并不會(huì)改變數(shù)據(jù),而是生成一份新的數(shù)據(jù),或者說是數(shù)據(jù)的一個(gè)新的版本。在這種設(shè)計(jì)下數(shù)據(jù)是永遠(yuǎn)不變的,變化的是數(shù)據(jù)的個(gè)數(shù)。這兩種設(shè)計(jì)都能解決同一個(gè)問題,但是難易程度不同,孰優(yōu)孰劣高下立見。

 


提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問題: