由于各種原因缅叠,好久沒有寫文章了。最近學(xué)習(xí)了一下架構(gòu)設(shè)計(jì)方面的知識臀脏,拿來和大家分享一下劝堪。
1. 架構(gòu)是什么
架構(gòu)是什么,大家能都說出一二揉稚,每個(gè)人對架構(gòu)的理解又不盡相同秒啦。但對于架構(gòu),我們有幾個(gè)模糊相似的概念需要知道搀玖,分別是:系統(tǒng)與子系統(tǒng)余境,模塊與組件,框架與架構(gòu)灌诅。來說說這幾種概念的區(qū)別芳来。
1. 系統(tǒng)與子系統(tǒng)
1. 系統(tǒng)
維基百科的解釋是:
系統(tǒng)泛指由一群有關(guān)聯(lián)的個(gè)體組成,根據(jù)某種規(guī)則運(yùn)作猜拾,能完成個(gè)別元件不能單獨(dú)完成的工作的群體即舌。
抽象成三部分,分別為:關(guān)聯(lián)(有關(guān)聯(lián)的個(gè)體)挎袜,規(guī)則(根據(jù)某種規(guī)則運(yùn)作)顽聂,能力(完成個(gè)別原件不不能單獨(dú)完成的工作,新能力)宋雏。
2. 子系統(tǒng)
根據(jù)字面意思芜飘,和系統(tǒng)定義相同,只是范圍更小磨总。舉個(gè)例子嗦明,如淘寶系統(tǒng),里面有資金蚪燕,購物娶牌,會員系統(tǒng)等奔浅,都是一個(gè)個(gè)子系統(tǒng)
2. 模塊與組件
模塊和組件都是系統(tǒng)的組成部分,但是從不同的角度拆分诗良,有了不同的名稱
1. 模塊
從邏輯單元拆分汹桦,得到的就是模塊。主要用與職責(zé)分離
2. 組件
從物理單元拆分鉴裹,得到的是組件舞骆。主要用于單元復(fù)用
3. 框架與架構(gòu)
1. 框架
框架更多用于規(guī)范,如MVVC径荔,MVP督禽,如實(shí)現(xiàn)MVC的Spring框架
2. 架構(gòu)
架構(gòu)更多的關(guān)注的是系統(tǒng)的結(jié)構(gòu)
2. 系統(tǒng)復(fù)雜度
現(xiàn)在,我們在設(shè)計(jì)架構(gòu)或系統(tǒng)時(shí)总处,關(guān)注的點(diǎn)有很多狈惫,安全,可用鹦马,性能等胧谈,主要總結(jié)下來,有6點(diǎn)荸频,分別是:高可用菱肖、高性能、可擴(kuò)展旭从、安全蔑滓、低成本,規(guī)模遇绞。接下來對這幾點(diǎn)進(jìn)行總結(jié)。
1. 高可用
對于用戶量大燎窘、訪問量高摹闽、重要的系統(tǒng)來說,高可用總是必不可少的褐健。高可用分為二部分付鹿,分別是計(jì)算高可用和存儲高可用。
計(jì)算高可用主要是通過增加計(jì)算單元蚜迅,如:多機(jī)部署舵匾。存儲高可用主要通過備份數(shù)據(jù),保證數(shù)據(jù)一致性谁不,但數(shù)據(jù)間同步坐梯,又是新的問題。不管是增加計(jì)算單元刹帕,還是數(shù)據(jù)備份吵血,都未系統(tǒng)帶來了新的復(fù)雜性谎替。但這些手段都是用來減少和避免不可用問題,而不是用來解決問題
2. 高性能
高性能復(fù)雜度主要體現(xiàn)在2個(gè)方面蹋辅,分別是:單機(jī)高性能復(fù)雜度钱贯,集群高性能度。
1. 單機(jī)高性能復(fù)雜度
單機(jī)提高性能主要體現(xiàn)在:多線程侦另,多進(jìn)程秩命。多線程在數(shù)據(jù)同步問題,多進(jìn)程在通信方面都會帶來復(fù)雜度
2. 集群高性能復(fù)雜度
集群復(fù)雜度主要體現(xiàn)在:任務(wù)分配褒傅,任務(wù)拆解弃锐。任務(wù)分配是在集群中,對任務(wù)如何分配是一個(gè)問題樊卓。任務(wù)拆解是因?yàn)樵诩褐袉喂?jié)點(diǎn)性能達(dá)到最大的時(shí)候拿愧,只有通過將任務(wù)通過過系統(tǒng)處理,來提高性能碌尔。
3. 可擴(kuò)展
可擴(kuò)展的復(fù)雜度主要體現(xiàn)在:預(yù)測變化浇辜,抽象在一直改變。
只有預(yù)測未來業(yè)務(wù)的變化唾戚,才能設(shè)計(jì)出可擴(kuò)展的系統(tǒng)柳洋。如:系統(tǒng)是否需要分庫分表,現(xiàn)在不需要叹坦,隨著業(yè)務(wù)增長需要嗎?..等等熊镣。
對系統(tǒng)抽象出來的代碼也會隨著業(yè)務(wù)的改變不停的改變,只有進(jìn)行深層次抽象才能兼容多種業(yè)務(wù)邏輯募书。推薦多使用設(shè)計(jì)模式绪囱。設(shè)計(jì)模式主要用來將變化和穩(wěn)定分離。
4. 低成本
低成本復(fù)雜度主要體現(xiàn)在與高可用相互違背莹捡,如:高性能可能需要引入新技術(shù)鬼吵,自研新框架,或增加機(jī)器篮赢,這些都會帶來成本的增加齿椅。但低成本是架構(gòu)設(shè)計(jì)考慮點(diǎn),但不是首要點(diǎn)启泣。
5. 安全
系統(tǒng)安全也是需要考慮涣脚。主要分為從架構(gòu)層面和代碼層面。
架構(gòu)層面需要考慮架構(gòu)是否安全寥茫,如Ddos攻擊遣蚀。 代碼層面要考慮功能是否安全。如:Sql注入,RSS
6. 規(guī)模
規(guī)模的復(fù)雜度主要體現(xiàn)在:規(guī)模增大妙同,會量變引起質(zhì)變射富。如用戶從1W變成10W,100W粥帚,就要考慮:高性能胰耗,高可用等。
3. 架構(gòu)設(shè)計(jì)三原則
架構(gòu)設(shè)計(jì)的主要原則體現(xiàn)在三方面芒涡,分別是:合適大于業(yè)界領(lǐng)先柴灯,簡單優(yōu)于復(fù)雜,演化優(yōu)于一步到位费尽。
1. 合適大于業(yè)界領(lǐng)先
在做架構(gòu)設(shè)計(jì)的時(shí)候赠群,要選擇業(yè)務(wù)合適的,而并非業(yè)界領(lǐng)先的旱幼。如:設(shè)計(jì)一個(gè)學(xué)生管理系統(tǒng)查描,看到大公司都是用微服務(wù),那我們就用是用微服務(wù)柏卤。這樣并不合適冬三,因?yàn)閷W(xué)生管理系統(tǒng)在用戶量,功能上等都打不到這樣的量缘缚,單機(jī)就可以勾笆,可能需要考慮數(shù)據(jù)問題,但這在數(shù)據(jù)層面解決即可
2. 簡單優(yōu)于復(fù)雜
在進(jìn)行架構(gòu)設(shè)計(jì)的時(shí)候桥滨,復(fù)雜的設(shè)計(jì)窝爪,帶來的邏輯關(guān)系,或業(yè)務(wù)處理關(guān)系就會變得更復(fù)雜齐媒。如:把一個(gè)系統(tǒng)拆分成10個(gè)系統(tǒng)交互蒲每,這樣帶來的問題遠(yuǎn)遠(yuǎn)大于一個(gè)系統(tǒng)。并且復(fù)雜的系統(tǒng)排查問題喻括,就需要更多的時(shí)間啃勉,花費(fèi)更多的精力
3. 演化優(yōu)于一步到位
任何事物是符合生物進(jìn)化論的,架構(gòu)設(shè)計(jì)也是如此双妨。一開始我們設(shè)計(jì)架構(gòu),并不能就"一步登天"叮阅。主要體現(xiàn)在:
- 人力刁品,資源方便過多的投入會浪費(fèi)資源
- 業(yè)務(wù)在不斷變化,并不能完全預(yù)測業(yè)務(wù)
在業(yè)務(wù)發(fā)展的的時(shí)候浩姥,會有更多的收入挑随,這時(shí)候,再花費(fèi)更多的資源勒叠,取其精華兜挨,去其糟粕膏孟,進(jìn)行重構(gòu),這樣也是合適的拌汇,收入和投入是成正比的柒桑。避免在一開始,進(jìn)行假大空設(shè)計(jì)噪舀,到頭來魁淳,業(yè)務(wù)并達(dá)不到量,浪費(fèi)設(shè)計(jì)与倡〗绻洌或系統(tǒng)過與龐大,導(dǎo)致系統(tǒng)無法上線等問題纺座。
4. 設(shè)計(jì)流程
設(shè)計(jì)流程主要也分了三部分息拜,分別是:識別復(fù)雜度,設(shè)計(jì)備選方案净响,設(shè)計(jì)系統(tǒng)詳細(xì)方案少欺。
1. 識別復(fù)雜度
根據(jù)業(yè)務(wù)的需求,將目前主要的復(fù)雜問題羅列出來别惦,根據(jù)團(tuán)隊(duì)狈茉,業(yè)務(wù),技術(shù)等綜合情況排序掸掸,選出最先需要解決的復(fù)雜問題氯庆。
2. 設(shè)計(jì)備選方案
在識別出系統(tǒng)復(fù)雜度問題后,我們就需要出設(shè)計(jì)方案扰付,但是設(shè)計(jì)方案不能只有一套堤撵,需要設(shè)計(jì)出3-5套。設(shè)計(jì)方案太少羽莺,可能會由于自己的疏忽实昨,見識等問題,未能覆蓋復(fù)雜問題盐固。設(shè)計(jì)的太多會影響精力荒给,耗費(fèi)大量的時(shí)間。
設(shè)計(jì)出的備選方案刁卜,需要有較大的區(qū)別志电,而不是一些無關(guān)緊要的區(qū)別,如:消息中間件是采用Kafka還是RocketMQ蛔趴,而不是消息延遲15s還是30s挑辆。
3. 設(shè)計(jì)出系統(tǒng)的詳細(xì)方案
在經(jīng)過溝通后,選擇出來一套整體看起來可行的方案,這個(gè)時(shí)候我們就需要給出更多的細(xì)節(jié)鱼蝉,分步驟洒嗤,分方式,分系統(tǒng)降低系統(tǒng)的復(fù)雜度魁亦。在設(shè)計(jì)詳細(xì)方案時(shí)渔隶,可以找出系統(tǒng)整體能否實(shí)施部署等問題。在根據(jù)出現(xiàn)問題吉挣,做出一些細(xì)節(jié)問題的修改派撕。
4. 架構(gòu)設(shè)計(jì)的目的
以上就是學(xué)習(xí)架構(gòu)設(shè)計(jì)方面的知識啦,經(jīng)過上面這些觀察睬魂,了解终吼,總出來一個(gè)架構(gòu)設(shè)計(jì)的目的。架構(gòu)設(shè)計(jì)的目的主要有兩點(diǎn):
- 解決系統(tǒng)軟件帶來的復(fù)雜度問題
- 應(yīng)對業(yè)務(wù)或其他變化帶來的麻煩
在做架構(gòu)設(shè)計(jì)的時(shí)候氯哮,要緊緊貼合架構(gòu)設(shè)計(jì)的目的际跪,我們才能設(shè)計(jì)出夠好的架構(gòu)。