<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          高可用 兜底方案

          共 3011字,需瀏覽 7分鐘

           ·

          2021-08-25 17:38

          對(duì)于秒殺系統(tǒng)來(lái)說(shuō),在大流量的迅猛沖擊下,都曾經(jīng)或多或少發(fā)生過(guò)宕機(jī)的情況。當(dāng)一個(gè)系統(tǒng)面臨持續(xù)的大流量時(shí),它其實(shí)很難單靠自身調(diào)整來(lái)恢復(fù)狀態(tài),你必須等待流量自然下降或者人為地把流量切走才行,這無(wú)疑會(huì)嚴(yán)重影響用戶的購(gòu)物體驗(yàn)

          沒(méi)有人能夠提前預(yù)估所有情況,意外無(wú)法避免。那么該怎么辦呢?我們可以在系統(tǒng)達(dá)到不可用狀態(tài)之前就做好流量限制,防止最壞情況的發(fā)生。任何一個(gè)系統(tǒng),都需要“反脆弱”。具體到秒殺這一場(chǎng)景下,為了保證系統(tǒng)的高可用,我們必須設(shè)計(jì)一個(gè)Plan B方案來(lái)兜底,這樣在最壞情況發(fā)生時(shí)我們?nèi)匀荒軌驈娜輵?yīng)對(duì)

          高可用建設(shè)著手點(diǎn)

          說(shuō)到系統(tǒng)的高可用建設(shè),它其實(shí)是一個(gè)系統(tǒng)工程,需要考慮到系統(tǒng)建設(shè)的各個(gè)階段,也就是說(shuō)它其實(shí)貫穿了系統(tǒng)建設(shè)的整個(gè)生命周期,如下圖所示:

          具體來(lái)說(shuō),系統(tǒng)的高可用建設(shè)涉及架構(gòu)階段、編碼階段、測(cè)試階段、發(fā)布階段、運(yùn)行階段,以及故障發(fā)生時(shí):

          1. 架構(gòu)階段:架構(gòu)階段主要考慮系統(tǒng)的可擴(kuò)展性和容錯(cuò)性,要避免系統(tǒng)出現(xiàn)單點(diǎn)問(wèn)題。例如多機(jī)房單元化部署,即使某個(gè)城市的某個(gè)機(jī)房出現(xiàn)整體故障,仍然不會(huì)影響整體網(wǎng)站的運(yùn)轉(zhuǎn)

          2. 編碼階段:編碼最重要的是保證代碼的健壯性,例如涉及遠(yuǎn)程調(diào)用問(wèn)題時(shí),要設(shè)置合理的超時(shí)退出機(jī)制,防止被其他系統(tǒng)拖垮,也要對(duì)調(diào)用的返回結(jié)果集有預(yù)期,防止返回的結(jié)果超出程序處理范圍,最常見(jiàn)的做法就是對(duì)錯(cuò)誤異常進(jìn)行捕獲,對(duì)無(wú)法預(yù)料的錯(cuò)誤要有默認(rèn)處理結(jié)果

          3. 測(cè)試階段:測(cè)試主要是保證測(cè)試用例的覆蓋度,保證最壞情況發(fā)生時(shí),我們也有相應(yīng)的處理流程

          4. 發(fā)布階段:發(fā)布時(shí)也有一些地方需要注意,因?yàn)榘l(fā)布時(shí)最容易出現(xiàn)錯(cuò)誤,因此要有緊急的回滾機(jī)制

          5. 運(yùn)行階段:運(yùn)行時(shí)是系統(tǒng)的常態(tài),系統(tǒng)大部分時(shí)間都會(huì)處于運(yùn)行態(tài),運(yùn)行態(tài)最重要的是對(duì)系統(tǒng)的監(jiān)控要準(zhǔn)確及時(shí),發(fā)現(xiàn)問(wèn)題能夠準(zhǔn)確報(bào)警并且報(bào)警數(shù)據(jù)要準(zhǔn)確詳細(xì),以便于排查問(wèn)題

          6. 故障發(fā)生:故障發(fā)生時(shí)首先最重要的就是及時(shí)止損,例如由于程序問(wèn)題導(dǎo)致商品價(jià)格錯(cuò)誤,那就要及時(shí)下架商品或者關(guān)閉購(gòu)買鏈接,防止造成重大資產(chǎn)損失。然后就是要能夠及時(shí)恢復(fù)服務(wù),并定位原因解決問(wèn)題

          為什么系統(tǒng)的高可用建設(shè)要放到整個(gè)生命周期中全面考慮?因?yàn)槲覀冊(cè)诿總€(gè)環(huán)節(jié)中都可能犯錯(cuò),而有些環(huán)節(jié)犯的錯(cuò),你在后面是無(wú)法彌補(bǔ)的。例如在架構(gòu)階段,沒(méi)有消除單點(diǎn)問(wèn)題,那么系統(tǒng)上線后,遇到突發(fā)流量把單點(diǎn)給掛了,就只能干瞪眼,有時(shí)候想加機(jī)器都加不進(jìn)去。所以高可用建設(shè)是一個(gè)系統(tǒng)工程,必須在每個(gè)環(huán)節(jié)都做好

          那么針對(duì)秒殺系統(tǒng),我們重點(diǎn)介紹在遇到大流量時(shí),應(yīng)該從哪些方面來(lái)保障系統(tǒng)的穩(wěn)定運(yùn)行,所以更多的是看如何針對(duì)運(yùn)行階段進(jìn)行處理,這就引出了接下來(lái)的內(nèi)容:降級(jí)、限流和拒絕服務(wù)

          降級(jí)

          所謂“降級(jí)”,就是當(dāng)系統(tǒng)的容量達(dá)到一定程度時(shí),限制或者關(guān)閉系統(tǒng)的某些非核心功能,從而把有限的資源保留給更核心的業(yè)務(wù)。它是一個(gè)有目的、有計(jì)劃的執(zhí)行過(guò)程,所以對(duì)降級(jí)我們一般需要有一套預(yù)案來(lái)配合執(zhí)行。如果我們把它系統(tǒng)化,就可以通過(guò)預(yù)案系統(tǒng)和開(kāi)關(guān)系統(tǒng)來(lái)實(shí)現(xiàn)降級(jí)

          降級(jí)方案可以這樣設(shè)計(jì):當(dāng)秒殺流量達(dá)到5w/s時(shí),把成交記錄的獲取從展示20條降級(jí)到只展示5條。“從20改到5”這個(gè)操作由一個(gè)開(kāi)關(guān)來(lái)實(shí)現(xiàn),也就是設(shè)置一個(gè)能夠從開(kāi)關(guān)系統(tǒng)動(dòng)態(tài)獲取的系統(tǒng)參數(shù)

          下面給出開(kāi)關(guān)系統(tǒng)的示意圖。它分為兩部分,一部分是開(kāi)關(guān)控制臺(tái),它保存了開(kāi)關(guān)的具體配置信息,以及具體執(zhí)行開(kāi)關(guān)所對(duì)應(yīng)的機(jī)器列表;另一部分是執(zhí)行下發(fā)開(kāi)關(guān)數(shù)據(jù)的Agent,主要任務(wù)就是保證開(kāi)關(guān)被正確執(zhí)行,即使系統(tǒng)重啟后也會(huì)生效

          執(zhí)行降級(jí)無(wú)疑是在系統(tǒng)性能和用戶體驗(yàn)之間選擇了前者,降級(jí)后肯定會(huì)影響一部分用戶的體驗(yàn),例如在雙11零點(diǎn)時(shí),如果優(yōu)惠券系統(tǒng)扛不住,可能會(huì)臨時(shí)降級(jí)商品詳情的優(yōu)惠信息展示,把有限的系統(tǒng)資源用在保障交易系統(tǒng)正確展示優(yōu)惠信息上,即保障用戶真正下單時(shí)的價(jià)格是正確的。所以降級(jí)的核心目標(biāo)是犧牲次要的功能和用戶體驗(yàn)來(lái)保證核心業(yè)務(wù)流程的穩(wěn)定,是一個(gè)不得已而為之的舉措

          限流

          如果說(shuō)降級(jí)是犧牲了一部分次要的功能和用戶的體驗(yàn)效果,那么限流就是更極端的一種保護(hù)措施了。限流就是當(dāng)系統(tǒng)容量達(dá)到瓶頸時(shí),我們需要通過(guò)限制一部分流量來(lái)保護(hù)系統(tǒng),并做到既可以人工執(zhí)行開(kāi)關(guān),也支持自動(dòng)化保護(hù)的措施

          總體來(lái)說(shuō),限流既可以是在客戶端限流,也可以是在服務(wù)端限流。此外,限流的實(shí)現(xiàn)方式既要支持URL以及方法級(jí)別的限流,也要支持基于QPS和線程的限流

          以內(nèi)部的系統(tǒng)調(diào)用為例,來(lái)分別說(shuō)下客戶端限流和服務(wù)端限流的優(yōu)缺點(diǎn):
          1、客戶端限流,好處可以限制請(qǐng)求的發(fā)出,通過(guò)減少發(fā)出無(wú)用請(qǐng)求從而減少對(duì)系統(tǒng)的消耗。缺點(diǎn)就是當(dāng)客戶端比較分散時(shí),沒(méi)法設(shè)置合理的限流閾值:如果閾值設(shè)的太小,會(huì)導(dǎo)致服務(wù)端沒(méi)有達(dá)到瓶頸時(shí)客戶端已經(jīng)被限制;而如果設(shè)的太大,則起不到限制的作用
          2、服務(wù)端限流,好處是可以根據(jù)服務(wù)端的性能設(shè)置合理的閾值,而缺點(diǎn)就是被限制的請(qǐng)求都是無(wú)效的請(qǐng)求,處理這些無(wú)效的請(qǐng)求本身也會(huì)消耗服務(wù)器資源

          在限流的實(shí)現(xiàn)手段上來(lái)講,基于QPS和線程數(shù)的限流應(yīng)用最多,最大QPS很容易通過(guò)壓測(cè)提前獲取,假設(shè)系統(tǒng)最高支持1w QPS時(shí),可以設(shè)置8000來(lái)進(jìn)行限流保護(hù)。線程數(shù)限流在客戶端比較有效,例如在遠(yuǎn)程調(diào)用時(shí)我們?cè)O(shè)置連接池的線程數(shù),超出這個(gè)并發(fā)線程請(qǐng)求,就將線程進(jìn)行排隊(duì)或者直接超時(shí)丟棄

          限流無(wú)疑會(huì)影響用戶的正常請(qǐng)求,所以必然會(huì)導(dǎo)致一部分用戶請(qǐng)求失敗,因此在系統(tǒng)處理這種異常時(shí)一定要設(shè)置超時(shí)時(shí)間,防止因被限流的請(qǐng)求不能fast fail(快速失敗)而拖垮系統(tǒng)

          拒絕服務(wù)

          如果限流還不能解決問(wèn)題,最后一招就是直接拒絕服務(wù)了

          當(dāng)系統(tǒng)負(fù)載達(dá)到一定閾值時(shí),例如CPU使用率達(dá)到90%或者系統(tǒng)load值達(dá)到2*CPU核數(shù)時(shí),系統(tǒng)直接拒絕所有請(qǐng)求,這種方式是最暴力但也最有效的系統(tǒng)保護(hù)方式

          例如秒殺系統(tǒng),我們?cè)谌缦聨讉€(gè)環(huán)節(jié)設(shè)計(jì)過(guò)載保護(hù):在最前端的Nginx上設(shè)置過(guò)載保護(hù),當(dāng)機(jī)器負(fù)載達(dá)到某個(gè)值時(shí)直接拒絕HTTP請(qǐng)求并返回503錯(cuò)誤碼,在Java層同樣也可以設(shè)計(jì)過(guò)載保護(hù)

          拒絕服務(wù)可以說(shuō)是一種不得已的兜底方案,用以防止最壞情況發(fā)生,防止因把服務(wù)器壓跨而長(zhǎng)時(shí)間徹底無(wú)法提供服務(wù)。像這種系統(tǒng)過(guò)載保護(hù)雖然在過(guò)載時(shí)無(wú)法提供服務(wù),但是系統(tǒng)仍然可以運(yùn)作,當(dāng)負(fù)載下降時(shí)又很容易恢復(fù),所以每個(gè)系統(tǒng)和每個(gè)環(huán)節(jié)都應(yīng)該設(shè)置這個(gè)兜底方案,對(duì)系統(tǒng)做最壞情況下的保護(hù)

          總結(jié)

          網(wǎng)站的高可用建設(shè)是基礎(chǔ),可以說(shuō)要深入到各個(gè)環(huán)節(jié),更要長(zhǎng)期規(guī)劃并進(jìn)行體系化建設(shè),要在預(yù)防(建立常態(tài)的壓力體系,例如上線前的單機(jī)壓測(cè)到上線后的全鏈路壓測(cè))、管控(做好線上運(yùn)行時(shí)的降級(jí)、限流和兜底保護(hù))、監(jiān)控(建立性能基線來(lái)記錄性能的變化趨勢(shì)以及線上機(jī)器的負(fù)載報(bào)警體系,發(fā)現(xiàn)問(wèn)題及時(shí)預(yù)警)和恢復(fù)體系(遇到故障要及時(shí)止損,并提供快速的數(shù)據(jù)訂正工具等)等這些地方加強(qiáng)建設(shè),每一個(gè)環(huán)節(jié)可能都有很多事情要做

          另外,要保證高可用建設(shè)的落實(shí),不僅要做系統(tǒng)建設(shè),還要在組織上做好保障。高可用其實(shí)就是在說(shuō)“穩(wěn)定性”。穩(wěn)定性是一個(gè)平時(shí)不重要,但真出了問(wèn)題就會(huì)要命的,所以很可能平時(shí)業(yè)務(wù)發(fā)展良好,穩(wěn)定性建設(shè)就會(huì)給業(yè)務(wù)讓路,相關(guān)的穩(wěn)定性平時(shí)根本得不到重視,一旦遇到故障就麻煩大了

          source:https://zhouj000.github.io/2018/10/19/SecKill-System-5/

          喜歡,在看

          瀏覽 26
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本女人牲交视频 | 日韩操屄视频 | 操操福利 | 欧美女人操逼视频 | seseav视频 |