2018-07-15-淺談高可用和設(shè)計(jì)的一些原則(JAVA)

前言

上文說(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ì)高可用原則

  1. 降級(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í):類(lèi)似推薦或者評(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ì)一些超大流量做友好處理。
  2. 隔離將系統(tǒng)或資源分開(kāi),服務(wù)之間都是有依賴的,很容易因一方面服務(wù)故障導(dǎo)致滾雪球,隔離能夠保障其它服務(wù)不會(huì)受影響,把問(wèn)題控制并降低。

    • 線程隔離:請(qǐng)求分類(lèi),不影響其它分類(lèi)線程池的正常運(yùn)行。
      線程隔離
    • 進(jìn)程隔離:物理分離,部署多個(gè)實(shí)例,通過(guò)負(fù)載均衡路由轉(zhuǎn)發(fā),但是更好的解決方案是將系統(tǒng)拆分為多個(gè)子系統(tǒng)來(lái)實(shí)現(xiàn)隔離。
    • 讀寫(xiě)隔離:類(lèi)似Redis就可用通過(guò)主從復(fù)制模式將讀和寫(xiě)進(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)行削峰。
  3. 限流限流主要是防止流量超出系統(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)求限流模塊。
  4. 分流引流就是當(dāng)某個(gè)服務(wù)掛了或者某個(gè)地方故障了需要把流量引向其他好的服務(wù)或者備用服務(wù)上去。

    • 負(fù)載均衡與反向代理
  5. 超時(shí)與重試機(jī)制設(shè)置超時(shí)能夠避免慢請(qǐng)求累積導(dǎo)致系統(tǒng)雪崩,需要設(shè)置合理的重試機(jī)制,并且應(yīng)該和熔斷、快速失敗機(jī)制配合。

  6. 回滾當(dāng)程序或者數(shù)據(jù)出錯(cuò),可用通過(guò)回滾恢復(fù)到最近的一個(gè)正確版本上,比如事務(wù)回滾、代碼庫(kù)回滾、更新版本回滾、數(shù)據(jù)庫(kù)回滾、靜態(tài)資源回滾等等。

  7. 壓測(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ū)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容