系統(tǒng)架構(gòu)設(shè)計(jì)指導(dǎo)思想

是什么毡泻?

架構(gòu)的本質(zhì)

架構(gòu)的本質(zhì)就是打造對(duì)業(yè)務(wù)和技術(shù)變化友好的有序系統(tǒng)拼弃。

系統(tǒng)由要素和連接關(guān)系組成斩萌,通過(guò)合理的“分”與“合”,把原先鐵板一塊的系統(tǒng)變成一個(gè)富有彈性的結(jié)構(gòu)化系統(tǒng)肉渴。這樣,系統(tǒng)的復(fù)雜性有效地分解了带射,系統(tǒng)的有序度大幅度地提升了同规。

架構(gòu)的分類

一般來(lái)說(shuō),主要分為業(yè)務(wù)架構(gòu)和技術(shù)架構(gòu)窟社。

開發(fā)的痛點(diǎn)主要由業(yè)務(wù)架構(gòu)來(lái)解決券勺,機(jī)器的痛點(diǎn)主要由技術(shù)架構(gòu)來(lái)解決。

業(yè)務(wù)架構(gòu)

就是講清楚核心業(yè)務(wù)場(chǎng)景的處理過(guò)程灿里,給出業(yè)務(wù)模塊的劃分(應(yīng)用)和依賴關(guān)系(應(yīng)用調(diào)用)关炼。

技術(shù)架構(gòu)

就是保障應(yīng)用的穩(wěn)定運(yùn)行。

好的架構(gòu)師

為什么钠四?

使系統(tǒng)配置和功能完整一致正交盗扒、高性能、高可用缀去、高擴(kuò)展侣灶、高安全、可監(jiān)控缕碎、能耗低

怎么樣褥影?

配置和功能完整一致正交

劃分服務(wù)邊界時(shí),要保證服務(wù)配置和功能完整咏雌,這樣才能支撐一個(gè)完整的業(yè)務(wù)領(lǐng)域凡怎;服務(wù)的配置和功能要一致,誰(shuí)擁有配置赊抖,誰(shuí)就負(fù)責(zé)提供相應(yīng)的功能统倒;如果是基礎(chǔ)服務(wù),它們處于調(diào)用鏈的底層氛雪,服務(wù)之間不會(huì)有任何的調(diào)用關(guān)系房匆,它們之間是正交的。

高性能

常用性能數(shù)據(jù)

降低響應(yīng)時(shí)間(處理一個(gè)信息的時(shí)間)

優(yōu)化處理單個(gè)請(qǐng)求路徑上每個(gè)節(jié)點(diǎn)的處理速度

短事務(wù);使用更好的算法和數(shù)據(jù)結(jié)構(gòu)浴鸿;通過(guò)緩存來(lái)代替數(shù)據(jù)庫(kù)訪問(wèn)井氢;通過(guò)索引,優(yōu)化數(shù)據(jù)庫(kù)查詢岳链。

并行處理單個(gè)請(qǐng)求

計(jì)算可并行花竞,把一個(gè)請(qǐng)求分解為多個(gè)子請(qǐng)求,內(nèi)部使用多個(gè)節(jié)點(diǎn)同時(shí)處理子請(qǐng)求掸哑,然后對(duì)結(jié)果進(jìn)行合并约急。這個(gè)在很多情況下并不可行,例如MapReduce 也有使用場(chǎng)景的限制举户。

提高吞吐率(單位時(shí)間內(nèi)處理信息的總量)

同時(shí)處理多個(gè)請(qǐng)求

同一個(gè)節(jié)點(diǎn)內(nèi)部烤宙,利用多進(jìn)程、多線程技術(shù)俭嘁;水平擴(kuò)展多個(gè)實(shí)例(無(wú)狀態(tài)和有狀態(tài)(往往需要很大改造))躺枕。

請(qǐng)求處理異步化

通過(guò)消息系統(tǒng)對(duì)流量進(jìn)行削峰,系統(tǒng)先把請(qǐng)求存起來(lái)供填,然后再在后臺(tái)慢慢處理拐云;在處理核心業(yè)務(wù)時(shí),把相對(duì)不核心的邏輯做異步化處理近她。

會(huì)導(dǎo)致處理結(jié)果不能實(shí)時(shí)返回叉瘩,有時(shí)候會(huì)影響到用戶體驗(yàn),而且對(duì)程序的改造也會(huì)比較大粘捎。

高可用

業(yè)務(wù)架構(gòu)

此處高可用更多地指可復(fù)用薇缅。

復(fù)用的分類

技術(shù)復(fù)用

代碼級(jí)復(fù)用。這里包括自己打包的類庫(kù)攒磨,第三方提供的 SDK泳桦,還有各種算法封裝等。我們的代碼可以直接調(diào)用它們娩缰,物理上也和我們的應(yīng)用打包在一起灸撰,運(yùn)行在同一個(gè)進(jìn)程里。代碼級(jí)復(fù)用是最低層次的復(fù)用拼坎,可以把它當(dāng)作你自己源代碼的一部分浮毯。

技術(shù)組件復(fù)用。這些組件有自己封裝的泰鸡,更多的是大量開源的中間件债蓝,比如 Redis、MQ盛龄、Dubbo 等惦蚊;組件也包括各種開發(fā)框架器虾,比如 Spring Cloud讯嫂。這些基礎(chǔ)組件技術(shù)復(fù)雜度很高蹦锋,它們的存在,極大地簡(jiǎn)化了我們的開發(fā)工作欧芽。

業(yè)務(wù)復(fù)用

業(yè)務(wù)實(shí)體復(fù)用莉掂。針對(duì)細(xì)分的業(yè)務(wù)領(lǐng)域,比如訂單千扔、商品憎妙、用戶等領(lǐng)域。它對(duì)各個(gè)業(yè)務(wù)領(lǐng)域的數(shù)據(jù)和業(yè)務(wù)規(guī)則進(jìn)行封裝曲楚,將它變成上層應(yīng)用系統(tǒng)可以直接使用的業(yè)務(wù)組件厘唾。

業(yè)務(wù)流程的復(fù)用。針對(duì)的是業(yè)務(wù)線龙誊,它可以把多個(gè)業(yè)務(wù)實(shí)體串起來(lái)抚垃,完成一個(gè)端到端的任務(wù)。比如說(shuō)趟大,下單流程需要訪問(wèn)會(huì)員鹤树、商品、訂單逊朽、庫(kù)存等多個(gè)業(yè)務(wù)領(lǐng)域罕伯,如果我們把這些調(diào)用邏輯封裝為一個(gè)下單流程服務(wù),那下單頁(yè)面就可以調(diào)用這個(gè)流程服務(wù)來(lái)完成下單叽讳,而不需要去深入了解下單的具體過(guò)程追他。相比單個(gè)的業(yè)務(wù)實(shí)體復(fù)用,業(yè)務(wù)流程的復(fù)用程度更高岛蚤,業(yè)務(wù)價(jià)值也更大邑狸。

整個(gè)系統(tǒng)的復(fù)用。比如說(shuō)一個(gè) SaaS 系統(tǒng)(Software-as-a-Service)灭美,它在內(nèi)部做了各種通用化設(shè)計(jì)推溃,允許我們通過(guò)各種參數(shù)配置,得到我們想要的功能届腐;或者說(shuō)一個(gè) PaaS(Platform-as-a-Service)平臺(tái)铁坎,它會(huì)提供可編程的插件化支持,允許我們“嵌入”外部代碼犁苏,實(shí)現(xiàn)想要的功能硬萍。

從技術(shù)復(fù)用到業(yè)務(wù)復(fù)用,越往上围详,復(fù)用程度越高朴乖,復(fù)用產(chǎn)生的價(jià)值也越大祖屏,但實(shí)現(xiàn)起來(lái)也越復(fù)雜,它能復(fù)用的場(chǎng)景就越有限买羞。

技術(shù)架構(gòu)

衡量標(biāo)準(zhǔn)

系統(tǒng)正常工作的時(shí)間除以總體時(shí)間袁勺。通常用幾個(gè) 9 來(lái)表示,比如 3 個(gè) 9 表示系統(tǒng)在 99.9% 的時(shí)間內(nèi)可用畜普,4 個(gè) 9 表示 99.99% 的時(shí)間內(nèi)可用期丰,這里的正常工作表示系統(tǒng)可以在相對(duì)合理的時(shí)間內(nèi)返回預(yù)計(jì)的結(jié)果。

故障點(diǎn)

故障點(diǎn)可以歸納為三類:

資源不可用吃挑。包括網(wǎng)絡(luò)和服務(wù)器出故障钝荡,網(wǎng)絡(luò)出故障表明節(jié)點(diǎn)連接不上,服務(wù)器出故障表明該節(jié)點(diǎn)本身不能正常工作舶衬。

資源不足埠通。常規(guī)的流量進(jìn)來(lái),節(jié)點(diǎn)能正常工作逛犹,但在高并發(fā)的情況下端辱,節(jié)點(diǎn)無(wú)法正常工作,對(duì)外表現(xiàn)為響應(yīng)超時(shí)圾浅。

節(jié)點(diǎn)的功能有問(wèn)題掠手。這個(gè)主要體現(xiàn)在我們開發(fā)的代碼上,比如它的內(nèi)部業(yè)務(wù)邏輯有問(wèn)題狸捕,或者是接口不兼容導(dǎo)致客戶端調(diào)用出了問(wèn)題喷鸽;另外有些不夠成熟的中間件,有時(shí)也會(huì)有功能性問(wèn)題灸拍。

架構(gòu)原則

處理線上事故的首要原則是先盡快恢復(fù)業(yè)務(wù)做祝。

正面保障

第一個(gè)設(shè)計(jì)原則是冗余無(wú)單點(diǎn)(主備)。

很多成熟的 HA 方案鸡岗,比如可以選擇 Nginx混槐、HAProxy、LVS 等負(fù)載均衡軟件轩性,能很好地支持雙節(jié)點(diǎn) +Keepalived 部署声登;提供多條通信線路;機(jī)房層面的冗余揣苏;數(shù)據(jù)庫(kù)有成熟的 MHA 方案悯嗓,支持主庫(kù)故障時(shí),能夠自動(dòng)實(shí)現(xiàn)主從切換卸察,應(yīng)用可以通過(guò) VIP 訪問(wèn)數(shù)據(jù)庫(kù)脯厨,因此這個(gè)切換過(guò)程對(duì)應(yīng)用也是透明的;Redis 本身就支持集群方式坑质,通過(guò)數(shù)據(jù)的多副本來(lái)支持故障轉(zhuǎn)移合武; Kafka通過(guò)數(shù)據(jù)的多分區(qū)临梗,實(shí)現(xiàn)故障的自動(dòng)切換,保證系統(tǒng)的可用性稼跳。

第二個(gè)設(shè)計(jì)原則是水平擴(kuò)展(主主)盟庞。

很多時(shí)候,系統(tǒng)的不可用都是因?yàn)榱髁恳鸬模涸诟卟l(fā)的情況下岂贩,系統(tǒng)往往會(huì)整體癱瘓茫经,完全不可用。

對(duì)于無(wú)狀態(tài)的計(jì)算節(jié)點(diǎn)萎津,比如應(yīng)用層和服務(wù)層來(lái)說(shuō),水平擴(kuò)展相對(duì)容易抹镊,直接增加機(jī)器锉屈,進(jìn)行健康檢測(cè),及時(shí)剔除失效節(jié)點(diǎn)垮耳,如Eureka颈渊;對(duì)于有狀態(tài)的節(jié)點(diǎn),比如數(shù)據(jù)庫(kù)终佛,我們可以通過(guò)水平分庫(kù)做水平擴(kuò)展俊嗽,不過(guò)這個(gè)需要應(yīng)用一起配合,做比較大的改造铃彰。

Redis 本身就支持集群方式绍豁,它可以通過(guò)多節(jié)點(diǎn)支持處理能力的水平擴(kuò)展; Kafka通過(guò)多節(jié)點(diǎn)部署來(lái)支持處理能力的水平擴(kuò)展牙捉。

減少損失

第三個(gè)原則是柔性事務(wù)竹揍。

在 CAP 理論中,系統(tǒng)的可用性邪铲、一致性和網(wǎng)絡(luò)容錯(cuò)性芬位,三個(gè)最多只能保證兩個(gè),在分布式系統(tǒng)的情況下带到,我們只能在 C 和 A 中選一個(gè)昧碉。

在很多業(yè)務(wù)場(chǎng)景中,系統(tǒng)的可用性比數(shù)據(jù)的實(shí)時(shí)一致性更重要揽惹,所以在實(shí)踐中被饿,我們更多地使用 BASE 理論來(lái)指導(dǎo)系統(tǒng)設(shè)計(jì)。在這里永丝,我們努力實(shí)現(xiàn)系統(tǒng)的基本可用和數(shù)據(jù)的最終一致锹漱。

柔性事務(wù)具體的實(shí)現(xiàn)方式有很多,比如說(shuō)慕嚷,通過(guò)異步消息在節(jié)點(diǎn)間同步數(shù)據(jù)哥牍。當(dāng)然毕泌,不同的方式闽巩,對(duì) C 和 A 的支持程度是不一樣的霹琼,我們?cè)谠O(shè)計(jì)系統(tǒng)時(shí)所踊,要根據(jù)業(yè)務(wù)的特點(diǎn)來(lái)決定具體的方式臼膏。

第四個(gè)原則是系統(tǒng)可降級(jí)扬霜。

限流:讓部分用戶流量進(jìn)入系統(tǒng)處理诈嘿,其它流量直接拋棄免胃。

在 Nginx 中設(shè)置每秒多少個(gè)并發(fā)的限制痹栖,超過(guò)這個(gè)并發(fā)數(shù)蛙奖,Nginx 就直接返回錯(cuò)誤潘酗。

降級(jí):系統(tǒng)拋棄部分不重要的功能,比如不發(fā)送短信通知雁仲,以此確保核心功能不受影響仔夺。或者針對(duì)具體的功能攒砖,我們?cè)O(shè)置好功能開關(guān)缸兔,讓代碼根據(jù)開關(guān)設(shè)置,靈活決定是否執(zhí)行這部分邏輯吹艇。比如商品搜索惰蜜,在系統(tǒng)繁忙時(shí),我們可以選擇不進(jìn)行復(fù)雜的深度搜索受神。

熔斷:我們不去調(diào)用出問(wèn)題的服務(wù)抛猖,讓系統(tǒng)繞開故障點(diǎn),就像電路的保險(xiǎn)絲一樣路克,自己熔斷樟结,切斷通路,避免系統(tǒng)資源大量被占用精算。比如瓢宦,用戶下單時(shí),如果積分服務(wù)出現(xiàn)問(wèn)題灰羽,我們就先不送積分驮履,后續(xù)再補(bǔ)償。

Spring Cloud 的 Hystrix 組件(開源熔斷框架)

高擴(kuò)展

業(yè)務(wù)架構(gòu)

對(duì)業(yè)務(wù)變化友好廉嚼。

面向業(yè)務(wù)線和業(yè)務(wù)流程玫镐,通過(guò)拆分,實(shí)現(xiàn)模塊劃分怠噪;通過(guò)整合恐似,優(yōu)化模塊連接關(guān)系。如果系統(tǒng)拆分整合得合理傍念,模塊就具有良好的封裝性矫夷,模塊定位明確葛闷,連接關(guān)系清晰,當(dāng)業(yè)務(wù)變化了双藕,只要調(diào)整相應(yīng)模塊的內(nèi)部淑趾,而它的功能接口基本不變,做到對(duì)業(yè)務(wù)變化友好忧陪。

拆分

先考慮垂直拆分扣泊,從大方向上,把不同業(yè)務(wù)線區(qū)分清楚嘶摊,再針對(duì)具體業(yè)務(wù)線延蟹,將業(yè)務(wù)處理流程在業(yè)務(wù)域的維度進(jìn)行水平拆分。

整合

通過(guò)整合更卒,對(duì)多個(gè)模塊進(jìn)行包裝等孵,形成更大粒度的抽象,相當(dāng)于減少了模塊的數(shù)量蹂空;模塊的定位更明確,連接關(guān)系也更清晰果录;新的業(yè)務(wù)線進(jìn)來(lái)上枕,它可以基于業(yè)務(wù)平臺(tái)快速落地。

技術(shù)架構(gòu)

對(duì)資源需求變化友好弱恒。

借助虛擬化和容器化技術(shù)辨萍,可以方便實(shí)現(xiàn)節(jié)點(diǎn)和系統(tǒng)級(jí)別的伸縮。

節(jié)點(diǎn)級(jí)別的伸縮

對(duì)于無(wú)狀態(tài)的節(jié)點(diǎn)返弹,直接手動(dòng)/自動(dòng)增減節(jié)點(diǎn)就可以锈玉;對(duì)于有狀態(tài)的服務(wù),需要能夠支持狀態(tài)數(shù)據(jù)的重新分布义起。

系統(tǒng)級(jí)別的伸縮

系統(tǒng)是一個(gè)整體拉背,可以把多個(gè)處理節(jié)點(diǎn)打包在一起(可以是整個(gè)系統(tǒng)),形成一個(gè)資源處理能力分配合理的處理單元默终。這樣可伸縮能力就更高了椅棺。

高安全

可監(jiān)控

對(duì)系統(tǒng)狀態(tài)變化友好。

無(wú)論采取了多么強(qiáng)大的高可用措施齐蔽,還是不能充分相信系統(tǒng)两疚,還需要借助額外的監(jiān)控來(lái)及時(shí)發(fā)現(xiàn)系統(tǒng)的問(wèn)題并加以解決。監(jiān)控是第二條保命措施含滴。

Metrics監(jiān)控

健康檢查

某個(gè)應(yīng)用是否存活诱渤。

調(diào)用鏈監(jiān)控

日志監(jiān)控

結(jié)構(gòu)化:k-v形式或json形式,直觀谈况,方便查詢

非結(jié)構(gòu)化:就是一個(gè)字符串

能耗低

當(dāng)業(yè)務(wù)低谷時(shí)勺美,可以快速地減少系統(tǒng)資源递胧,保證系統(tǒng)的低能量消耗。

每臺(tái)機(jī)器提供合理的性能励烦,以便減少機(jī)器谓着,從而降低能耗。

實(shí)現(xiàn)了系統(tǒng)的高性能和可伸縮坛掠,就表明已經(jīng)最大限度地利用了機(jī)器資源赊锚,那么能耗低就是自然的結(jié)果。

特別鳴謝:

1屉栓、得到平臺(tái)劉潤(rùn)老師

2舷蒲、極客時(shí)間平臺(tái)楊波老師

3、極客時(shí)間平臺(tái)王慶友老師

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末友多,一起剝皮案震驚了整個(gè)濱河市牲平,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌域滥,老刑警劉巖纵柿,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昂儒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)渊跋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門着倾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拾酝,“玉大人,你說(shuō)我怎么就攤上這事卡者。” “怎么了虎眨?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嗽桩。 經(jīng)常有香客問(wèn)我岳守,道長(zhǎng),這世上最難降的妖魔是什么碌冶? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮譬重,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臀规。我一直安慰自己,他們只是感情好塔嬉,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恩袱,像睡著了一般胶哲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸯屿,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天寄摆,我揣著相機(jī)與錄音,去河邊找鬼冰肴。 笑死榔组,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的检痰。 我是一名探鬼主播锨推,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼换可!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起慨飘,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎休弃,沒(méi)想到半個(gè)月后圈膏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稽坤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年慎皱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茫多。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡天揖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出今膊,到底是詐尸還是另有隱情,我是刑警寧澤市埋,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布恕刘,位于F島的核電站,受9級(jí)特大地震影響褐着,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜频敛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一馅扣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汁展,春花似錦、人聲如沸食绿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铲汪。三九已至,卻和暖如春掌腰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齿梁。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工勺择, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人省核。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓气忠,卻偏偏與公主長(zhǎng)得像邻储,于是被迫代替她去往敵國(guó)和親旧噪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361