前言
上文說(shuō)到了關(guān)于高并發(fā)的一些原則及設(shè)計(jì)亿胸,這篇主要是講講關(guān)于高可用這一塊侈玄,畢竟都是難兄難弟吟温,誰(shuí)也離不開(kāi)誰(shuí)。
關(guān)于高可用潘悼?
高可用的本質(zhì)就是對(duì)系統(tǒng)的不確定性做預(yù)期準(zhǔn)備爬橡,來(lái)保證服務(wù)的健康,包括經(jīng)常聽(tīng)到的數(shù)據(jù)丟失宾添、容災(zāi)缕陕、故障
等除了不可抗因素外疙挺,要達(dá)到所謂衡量標(biāo)準(zhǔn)的N個(gè)9
。
關(guān)于N個(gè)9的計(jì)算方式蔬崩,例如3個(gè)9:(1-99.9%) * 365 * 24=8.76小時(shí)锦爵,表示該軟件系統(tǒng)在連續(xù)運(yùn)行1年時(shí)間里最多可能的業(yè)務(wù)中斷時(shí)間是8.76小時(shí)。
設(shè)計(jì)高可用原則
-
降級(jí)
:總的來(lái)說(shuō)就是保障數(shù)據(jù)最終一致性沪袭,分散流量,提前預(yù)處理或分散處理侠鳄,前面文章里面說(shuō)到的Hystrix熔斷就是實(shí)現(xiàn)服務(wù)降級(jí)與依賴隔離死宣,對(duì)訪問(wèn)down服務(wù)進(jìn)行隔離丟給降級(jí)后的服務(wù)處理,防止影響到其它服務(wù)博秫。這里說(shuō)的是服務(wù)/業(yè)務(wù)方面的降級(jí)眶掌,當(dāng)然還有很多其它方面。例如:
降級(jí)-
超時(shí)降級(jí):
類似推薦或者評(píng)論啊即寒,暫時(shí)不展示或者暫未更新對(duì)整體不會(huì)有太大的影響母赵。 -
依賴降級(jí):
針對(duì)的是一些外部服務(wù)具滴,一些不穩(wěn)定的API。 -
故障降級(jí):
網(wǎng)絡(luò)施绎、RPC服務(wù)等掛掉了贞绳,處理方案可以通過(guò)緩存致稀、默認(rèn)值、兜底數(shù)據(jù)來(lái)保障萎攒。 -
限流降級(jí):
針對(duì)一些超大流量做友好處理矛绘。
-
-
隔離
:將系統(tǒng)或資源分開(kāi),服務(wù)之間都是有依賴的羊精,很容易因一方面服務(wù)故障導(dǎo)致滾雪球囚玫,隔離能夠保障其它服務(wù)不會(huì)受影響读规,把問(wèn)題控制并降低束亏。-
線程隔離:
請(qǐng)求分類阵具,不影響其它分類線程池的正常運(yùn)行。
線程隔離 -
進(jìn)程隔離:
物理分離雀久,部署多個(gè)實(shí)例赖捌,通過(guò)負(fù)載均衡路由轉(zhuǎn)發(fā)矮烹,但是更好的解決方案是將系統(tǒng)拆分為多個(gè)子系統(tǒng)來(lái)實(shí)現(xiàn)隔離。 -
讀寫隔離:
類似Redis就可用通過(guò)主從復(fù)制模式將讀和寫進(jìn)行集群分離卤唉。 -
動(dòng)靜隔離:
前面說(shuō)的高并發(fā)也提到過(guò)仁期,都是相輔相成的,把動(dòng)態(tài)內(nèi)容和靜態(tài)資源分離熬的,靜態(tài)資源可用提前做緩存赊级。 -
爬蟲(chóng)隔離:
主要是為了防止惡意請(qǐng)求流量,會(huì)導(dǎo)致正常流量不可用橡伞,所以一方面可用通過(guò)限流解決晋被,一方面可用將爬蟲(chóng)單獨(dú)路由到單獨(dú)服務(wù)上,或者讓爬蟲(chóng)只能訪問(wèn)到cache挂脑。 -
熱點(diǎn)隔離:
熱點(diǎn)一般都是能夠提前預(yù)知的,比如秒殺谴分、搶購(gòu)镀脂、大降價(jià)等,最好是做成獨(dú)立系統(tǒng)或者服務(wù)進(jìn)行隔離沙兰,也可用通過(guò)緩存和隊(duì)列來(lái)進(jìn)行削峰翘魄。
-
-
限流
:限流主要是防止流量超出系統(tǒng)峰值,是限制流量穿透到后端薄弱的應(yīng)用層斋射,這個(gè)可用從多個(gè)方面考慮但荤;最終做到有損服務(wù)而不是不服務(wù)
。常用的限流算法有令牌桶桑包、漏桶等纺非。-
限制并發(fā)/連接/請(qǐng)求數(shù):
系統(tǒng)都是由閥值(TPS/QPS)的,超過(guò)了要么非常慢弱左,要么直接被擊垮倒信。 -
時(shí)間內(nèi)/平滑限流:
限制時(shí)間內(nèi)的請(qǐng)求次數(shù),或者每隔多長(zhǎng)時(shí)間處理一個(gè)請(qǐng)求。 -
接入層限流:
接入層也就是請(qǐng)求流量的入口优妙,像Nginx自帶的兩個(gè)模塊就可以,連接數(shù)限流模塊和請(qǐng)求限流模塊卡辰。
-
-
分流
:引流就是當(dāng)某個(gè)服務(wù)掛了或者某個(gè)地方故障了需要把流量引向其他好的服務(wù)或者備用服務(wù)上去。負(fù)載均衡與反向代理
超時(shí)與重試機(jī)制
:設(shè)置超時(shí)能夠避免慢請(qǐng)求累積導(dǎo)致系統(tǒng)雪崩反砌,需要設(shè)置合理的重試機(jī)制萌朱,并且應(yīng)該和熔斷、快速失敗機(jī)制配合酒贬。回滾
:當(dāng)程序或者數(shù)據(jù)出錯(cuò)翠霍,可用通過(guò)回滾恢復(fù)到最近的一個(gè)正確版本上,比如事務(wù)回滾零如、代碼庫(kù)回滾锄弱、更新版本回滾、數(shù)據(jù)庫(kù)回滾辕翰、靜態(tài)資源回滾等等狈谊。壓測(cè)與預(yù)案
:評(píng)估系統(tǒng)的穩(wěn)定性和性能,提前做好應(yīng)急預(yù)案壁榕。
總結(jié)來(lái)說(shuō)通過(guò)降級(jí)保證服務(wù)有損而不是不可用赎瞎,通過(guò)限流保護(hù)服務(wù)健康避免雪崩,通過(guò)分流與隔離保障服務(wù)正常并能夠?qū)收蠈?shí)行隔離牡辽,設(shè)置合理的超時(shí)與重試機(jī)制避免請(qǐng)求堆積敞临,通過(guò)回滾能夠快速修復(fù)。做到這些往往能實(shí)現(xiàn)系統(tǒng)的高可用奏黑。
附上設(shè)計(jì)例圖:
結(jié)語(yǔ)
關(guān)于例圖里面的一些詳細(xì)示例以后再慢慢補(bǔ)充吧!
推薦:淺談高并發(fā)和設(shè)計(jì)的一些原則(JAVA)
個(gè)人博客~
簡(jiǎn)書(shū)~