<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>

          微服務(wù)架構(gòu)下服務(wù)故障處理解決方案

          共 2497字,需瀏覽 5分鐘

           ·

          2021-01-07 19:55


          ? 點擊上方“JavaEdge”,關(guān)注公眾號

          設(shè)為“星標”,好文章不錯過!


          微服務(wù)優(yōu)勢之一是可縮小故障影響范圍,局限在某個服務(wù)中。那一個服務(wù)出現(xiàn)故障該如何處理?

          1 集群故障


          可能整個集群都會故障,無法再對外提供服務(wù)。



          1.1 故障原因


          • 代碼bug
            比如OOM

          • 突發(fā)的流量沖擊,超出了系統(tǒng)的最大承載能力

            比如秒殺,會在某個時刻瞬間涌入大量流量,超出系統(tǒng)承載能力




          1.2 解決方案


          1.2.1 限流


          系統(tǒng)所能承載流量根據(jù)集群規(guī)模是固定的,稱為系統(tǒng)最大容量。當真實流量超過系統(tǒng)最大容量,系統(tǒng)響應(yīng)就會變慢,服務(wù)調(diào)用出現(xiàn)大量超時,用戶就會感覺卡頓、無響應(yīng)。所以,應(yīng)根據(jù)系統(tǒng)最大容量,給系統(tǒng)設(shè)置閾值,超過閾值的請求會被自動丟棄,便可保證系統(tǒng)服務(wù)正常。

          通常一個微服務(wù)系統(tǒng)會同時提供多個服務(wù),每個服務(wù)在同一時刻的請求量也不同,很可能系統(tǒng)中某服務(wù)的請求量激增,占用系統(tǒng)大部分資源,導(dǎo)致其他服務(wù)無資源可用。

          因此,要針對系統(tǒng)中每個服務(wù)的請求量設(shè)置閾值,超過閾值的請求也要丟棄,不至于因為一個服務(wù)影響其他服務(wù)。

          可用如下指標衡量服務(wù)的請求量:

          • QPS

          • 工作線程數(shù)

          QPS因不同服務(wù)的響應(yīng)快慢不同,所以系統(tǒng)能承載QPS相差大,所以一般選擇工作線程數(shù)作為限流指標,給系統(tǒng)設(shè)置

          • 總的最大工作線程數(shù)

          • 單個服務(wù)的最大工作線程數(shù)

          如此,無論是系統(tǒng)總請求量過大導(dǎo)致整體工作線程數(shù)量達到最大工作線程數(shù),還是某服務(wù)的請求量超過單個服務(wù)的最大工作線程數(shù),都會被限流。



          1.2.2 降級




          通過停止系統(tǒng)中的某些功能,保證系統(tǒng)整體的可用性,屬一種被動防御方案,因為一般是系統(tǒng)已故障后所采取的一種止損操作。



          如何實現(xiàn)


          通過開關(guān),在系統(tǒng)運行的內(nèi)存中開辟一塊區(qū)域,專門用于存儲開關(guān)狀態(tài)啟還是關(guān)閉。并且需監(jiān)聽某端口,通過該端口可向系統(tǒng)下發(fā)命令以改變內(nèi)存中開關(guān)狀態(tài)。當開關(guān)開啟時,業(yè)務(wù)的某段邏輯就不再執(zhí)行,而正常情況下,開關(guān)是關(guān)閉的狀態(tài)。



          適用場景


          • 新增的業(yè)務(wù)邏輯
            因為新增的業(yè)務(wù)邏輯相對來說不成熟,充滿風險,需加開關(guān)控制新業(yè)務(wù)邏輯是否執(zhí)行

          • 依賴的服務(wù)或資源
            因依賴的服務(wù)或資源不總是可靠,最好有開關(guān)控制是否對依賴服務(wù)或資源發(fā)起調(diào)用,以保證即使依賴出現(xiàn)問題,也能降級避免影響




          分級


          • 一級降級,對業(yè)務(wù)影響最小的

            故障時,先執(zhí)行一級降級,所以一級降級也可設(shè)置成自動降級而無需人工

          • 二級降級,對業(yè)務(wù)有一定影響

            故障時,若一級降級起不了啥作用,可采取人工

          • 三級降級,對業(yè)務(wù)較大影響

            這種降級要么對重大影響金錢交易,要么嚴重影響用戶體驗


          2 單IDC故障


          為保證業(yè)務(wù)的高可用,部署在不止一個IDC。整個IDC脫網(wǎng)的事情時有發(fā)生,多半是因為不可抗力比如機房著火、光纜被挖斷。

          如果業(yè)務(wù)全部部署在這個IDC,那就完全不可訪問,所以采用多IDC部署。

          • 有的采用同城雙活,也就是在一個城市的兩個IDC內(nèi)部署

          • 有的采用異地多活,一般是在兩個城市的兩個IDC內(nèi)部署

          • 支付寶這種金融級別的應(yīng)用采用“三地五中心”部署,這種部署成本顯然高比兩個IDC要高得多,但可用性的保障要更高

          采用多IDC部署的最大好處就是當有一個IDC發(fā)生故障時,可以把原來訪問故障IDC的流量切換到正常的IDC,來保證業(yè)務(wù)的正常訪問。



          流量切換方案


          基于DNS解析的流量切換


          通過把請求訪問域名解析的VIP從一個IDC切換到另外一個IDC。
          比如訪問“www.baidu.com”,正常情況下北方用戶會解析到聯(lián)通機房的VIP,南方用戶會解析到電信機房的VIP,如果聯(lián)通機房發(fā)生故障的話,會把北方用戶訪問也解析到電信機房的VIP,只不過此時網(wǎng)絡(luò)延遲可能會變長。

          基于RPC分組的流量切換


          對于一個服務(wù),如果是部署在多個IDC的話,一般每個IDC就是一個分組。假如一個IDC出現(xiàn)故障,那么原先路由到這個分組的流量,就可以通過向配置中心下發(fā)命令,把原先路由到這個分組的流量全部切換到別的分組,這樣的話就可以切換故障IDC的流量了。

          3 單機故障


          集群中的個別機器出現(xiàn)故障,這種情況往往對全局沒有太大影響,但會導(dǎo)致調(diào)用到故障機器上的請求都失敗,影響整個系統(tǒng)的成功率。

          發(fā)生概率最高的一種故障,尤其對于業(yè)務(wù)量大的互聯(lián)網(wǎng)應(yīng)用來說,上萬臺機器的規(guī)模也是很常見的。這種情況下,發(fā)生單機故障的概率就很高了,這個時候只靠運維人肉處理顯然不可行,所以就要求有某種手段來自動處理單機故障。

          處理單機故障一個有效的辦法就是自動重啟
          你可以設(shè)置一個閾值,比如以某個接口的平均耗時為準,當監(jiān)控單機上某個接口的平均耗時超過一定閾值時,就認為這臺機器有問題,這個時候就需要把有問題的機器從線上集群中摘除掉,然后在重啟服務(wù)后,重新加入到集群中。

          注意,需要防止網(wǎng)絡(luò)抖動造成的接口超時從而觸發(fā)自動重啟。一種方法是在收集單機接口耗時數(shù)據(jù)時,多采集幾個點,比如每10s采集一個點,采集5個點,當5個點中有超過3個點的數(shù)據(jù)都超過設(shè)定的閾值范圍,才認為是真正的單機問題,這時會觸發(fā)自動重啟策略。

          為了防止某些特殊情況下,短時間內(nèi)被重啟的單機過多,造成整個服務(wù)池可用節(jié)點數(shù)太少,最好是設(shè)置一個可重啟的單機數(shù)量占整個集群的最大比例,一般這個比例不要超過10%,因為正常情況下,不大可能有超過10%的單機都出現(xiàn)故障。

          總結(jié)


          故障時,往往多手段并用,比如單IDC故障,先要快速切換流量到正常IDC,但此時可能正常IDC不足以支撐兩IDC流量,所以先要降級部分功能,保證正常的IDC順利支撐切換過來的流量。

          要盡量讓故障處理自動化,可大大減少故障影響時間。

          往期推薦


          大廠如何解決數(shù)值精度/舍入/溢出問題

          硬核干貨:HTTP超時、重復(fù)請求必見坑點及解決方案

          由于不知線程池的bug,某Java程序員叕被祭天

          程序員因重復(fù)記錄日志撐爆ELK被辭退!

          擁抱Kubernetes,再見了Spring Cloud




          目前交流群已有?800+人,旨在促進技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進群


          喜歡文章,點個“在看、點贊、分享”素質(zhì)三連支持一下~

          瀏覽 21
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  亚洲无码二区 | 亚洲视频欧美视频视频一区 | 青青艹,天天射 | 夜夜夜夜操 | 日韩欧美超清 |