- 相關(guān)推薦
關(guān)于分布式系統(tǒng)架構(gòu)
對(duì)于軟件架構(gòu),更多的是一種思想,即內(nèi)功修為。在道與術(shù)層面,則更偏重道的修煉,道的深度決定架構(gòu)的境界。相對(duì)而言,術(shù)是手段,隨不同的環(huán)境應(yīng)運(yùn)而生,就像太極劍法和獨(dú)孤九劍,能做到隨境而變。
架構(gòu)是一種權(quán)衡
沒有一種架構(gòu)可以應(yīng)用到所有環(huán)境,也沒有一個(gè)技術(shù)或框架可以解決所有問(wèn)題,即使是針對(duì)同一種場(chǎng)景也往往存在多種解決方案。在架構(gòu)的時(shí)候,更多的是方案和手段的權(quán)衡,例如高可用性、高并發(fā)性、一致性本身就存在一定的矛盾;而異步還是同步、是否需要事務(wù)、如何應(yīng)用事務(wù)、緩存、拆分、容災(zāi)、發(fā)布等等,每一項(xiàng)都需要從各種技術(shù)實(shí)現(xiàn)中進(jìn)行權(quán)衡。細(xì)化到框架,ActiveMQ、RocketMQ、Kafka、Redis、ZooKeeper等等都可以實(shí)現(xiàn)消息隊(duì)列模型,具體使用哪個(gè)就需要結(jié)合場(chǎng)景進(jìn)行權(quán)衡了。
分與合
天下大事,合久必分、分久必合,在解決高并發(fā)分布式的問(wèn)題時(shí)絕大部分都在使用分與合的思想。
當(dāng)數(shù)據(jù)量很大、并發(fā)量很多的時(shí)候就需要考慮拆分(分而治之),例如分層設(shè)計(jì)、橫向拆分、縱向拆分、分IDC、分庫(kù)分表...等等。并且這些拆分本身就是分層的,例如在DNS層可以將流量按照地域或運(yùn)營(yíng)商分配到不同的IDC、業(yè)務(wù)層可以將業(yè)務(wù)處理邏輯分配到多個(gè)子系統(tǒng)、系統(tǒng)層可以根據(jù)用戶進(jìn)行橫向拆分、而存儲(chǔ)層可以根據(jù)規(guī)則將數(shù)據(jù)分配到不同的庫(kù)不同的表;另外讀寫分離、熱點(diǎn)分離、獨(dú)立出緩存層也體現(xiàn)了分布式系統(tǒng)架構(gòu)中分的思想。
為什么要做這么多的拆分,拆分就是為了化多為少,在單節(jié)點(diǎn)處理能力有限的情況下,通過(guò)橫向拆分提供無(wú)線的擴(kuò)展能力,當(dāng)巨大的流量通過(guò)拆分后,每個(gè)節(jié)點(diǎn)要處理的QPS就會(huì)下降;拆分是為了化繁為簡(jiǎn),簡(jiǎn)化單節(jié)點(diǎn)的復(fù)雜度,現(xiàn)在的微服務(wù)(當(dāng)然微服務(wù)引發(fā)的服務(wù)治理需要另說(shuō))、二階段事務(wù)提交,就是將復(fù)雜的業(yè)務(wù)通過(guò)多維度的拆分降解單節(jié)點(diǎn)復(fù)雜度的手段。
拆多了就要合,hadoop將復(fù)雜的任務(wù)分解到一個(gè)個(gè)的mapreduce job處理和聚合后,處理效率得到了極大的提升,而這種分解必然伴隨著聚合。而在有些業(yè)務(wù)場(chǎng)景,兩類節(jié)點(diǎn)相互調(diào)用非常頻繁,通過(guò)合并將原本的RPC調(diào)用轉(zhuǎn)換為本地JVM調(diào)用,則可以很大的提升系統(tǒng)性能。
隔離
隔離也是一種思想,其中也包含了分的意思,例如灰度、壓測(cè)隔離、動(dòng)靜隔離、多版本發(fā)布等。
轉(zhuǎn)換
路由與轉(zhuǎn)換,可以看做是分思想的衍生物。分的太多,就需要能將請(qǐng)求轉(zhuǎn)發(fā)到正確的位置,此外也需要將各種通信格式與協(xié)議進(jìn)行轉(zhuǎn)換。
重復(fù)與唯一(冪等)
冪等伴隨著請(qǐng)求的靠套投遞而產(chǎn)生,在發(fā)送請(qǐng)求時(shí)可能會(huì)存在如下幾個(gè)場(chǎng)景:接收端不一定要接收、接收端只能接收一次、接收端可重復(fù)接收。對(duì)于配置推送平臺(tái),大多場(chǎng)景要求接收端可重復(fù)接收配置信息,但只保存最后一次消息即可;而對(duì)于一筆付款請(qǐng)求,如果重復(fù)發(fā)送,接收端要控制只能處理一次(即要進(jìn)行冪等控制)。
最終一致
在分布式系統(tǒng)架構(gòu)中,面對(duì)事務(wù)性業(yè)務(wù)有兩種選擇,一種是分布式事務(wù)、一種是最終一致性處理。分布式事務(wù)控制比較復(fù)雜,一般采用二階段提交的方式,其思想是要么成功要么失敗,注意要么失敗是指其中有一步出錯(cuò)就全部回滾,看似是保證了數(shù)據(jù)一致性但實(shí)際業(yè)務(wù)卻失敗了。而最終一致性相對(duì)于分布式事務(wù)的核心思想是讓業(yè)務(wù)盡可能成功,即當(dāng)業(yè)務(wù)處理過(guò)程中可能會(huì)存在中間步驟失敗的情況,但通過(guò)補(bǔ)償邏輯可以保障失敗的步驟后續(xù)繼續(xù)執(zhí)行,此時(shí)就應(yīng)該盡可能的標(biāo)記業(yè)務(wù)成功。
并行與串行
將大量的計(jì)算分散到多個(gè)節(jié)點(diǎn)、多個(gè)進(jìn)程、多個(gè)線程進(jìn)行并行處理,是應(yīng)對(duì)大數(shù)據(jù)計(jì)算的常用技巧。而伴隨并行的就是串行(或者說(shuō)是并發(fā)鎖)的處理,在分布式環(huán)境,并發(fā)鎖的可以通過(guò)數(shù)據(jù)庫(kù)、zookeeper等進(jìn)行實(shí)現(xiàn)。
主動(dòng)與被動(dòng)
主動(dòng)與被動(dòng)主要是針對(duì)客戶端如何獲取服務(wù)端內(nèi)容的場(chǎng)景,典型的就是消息隊(duì)列中的推模式(push)和拉模式(pull)。具體底層實(shí)現(xiàn)上,無(wú)外乎輪詢、長(zhǎng)鏈接等等,其中使用輪詢不一定就是拉模型,很多推模型其底層也是通過(guò)輪詢實(shí)現(xiàn)的。
同步與異步
同步與異步也是經(jīng)常要面臨抉擇的事情,異步可以減少系統(tǒng)的阻塞,例如Ajax、消息隊(duì)列(還可以達(dá)到消峰填谷的作用)等等。此外流式計(jì)算與離線計(jì)算,也可以看做是同步與異步的衍生技術(shù)。再深一層次,會(huì)衍生批量計(jì)算、全量、增量等思想。
點(diǎn)到為止
限流:當(dāng)巨大的流量打過(guò)來(lái)時(shí),通過(guò)犧牲部分請(qǐng)求處理可保證整個(gè)系統(tǒng)可用;
降級(jí):當(dāng)面對(duì)流量高峰時(shí)(例如大促)往往將次要的服務(wù)停掉,以便節(jié)省資源給主要服務(wù);另外當(dāng)某個(gè)服務(wù)不可用時(shí),直接返回默認(rèn)結(jié)果也是降級(jí)的一種表現(xiàn);
熔斷:對(duì)于金融系統(tǒng),當(dāng)出現(xiàn)bug時(shí)可能會(huì)造成資損,此時(shí)需要旁路系統(tǒng)進(jìn)行不斷的核對(duì),當(dāng)發(fā)現(xiàn)異常時(shí)能夠及時(shí)終止處理。
對(duì)于以上幾個(gè)方面,系統(tǒng)要能做到自動(dòng)限流、自動(dòng)降級(jí)和自動(dòng)熔斷。
以上一切問(wèn)題都是由于量(數(shù)據(jù)量、請(qǐng)求量等等)產(chǎn)生的,當(dāng)量很小時(shí)不需要架構(gòu),通過(guò)增加內(nèi)存、CPU、機(jī)器等都能解決;當(dāng)量增加到一定的程度時(shí),才需要考慮架構(gòu),而架構(gòu)的道與術(shù)卻又是“道可道,非常道,名可名,非常名”。
【分布式系統(tǒng)架構(gòu)】相關(guān)文章:
系統(tǒng)架構(gòu)設(shè)計(jì)模式大全08-22
如何成為優(yōu)秀的系統(tǒng)架構(gòu)師06-03
基于云架構(gòu)的系統(tǒng)安全設(shè)計(jì)08-08
系統(tǒng)架構(gòu)師的就業(yè)前景分析01-11