一文读懂容错机制
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/u012482647/article/details/78148447
隨著分布式、微服務(wù)項(xiàng)目的快速發(fā)展,各個(gè)服務(wù)之間的通訊,難免出現(xiàn)依賴關(guān)系,若某一個(gè)單元出現(xiàn)故障,就很容易因依賴關(guān)系而發(fā)生故障的蔓延,為了解決這樣的問(wèn)題,容錯(cuò)作為其中一項(xiàng)很重要的技術(shù)也廣為人知。
導(dǎo)語(yǔ)
容錯(cuò)機(jī)制廣義的理解,就是包含了很多處理錯(cuò)誤的機(jī)制,如:熔斷機(jī)制、降級(jí)機(jī)制、補(bǔ)償機(jī)制、隔斷機(jī)制等等。我們針對(duì)經(jīng)常使用的機(jī)制進(jìn)行討論,說(shuō)明這么多容錯(cuò)機(jī)制設(shè)計(jì)的思路,熟悉了這些之后,也許你對(duì)設(shè)計(jì)分布式項(xiàng)目會(huì)有所裨益。
隔離機(jī)制
-
隔離設(shè)計(jì)思路
如上圖所示(圖來(lái)源于網(wǎng)絡(luò)),隔離來(lái)自單詞隔板(Bulkheads),隔板作用就是如果某一邊船艙漏水,不會(huì)導(dǎo)致整條船裝滿水而導(dǎo)致整條船下沉于水中。
分布式項(xiàng)目中,我們通過(guò)技術(shù)實(shí)現(xiàn)隔板的作用,做到故障隔離,一般來(lái)說(shuō),一種是通過(guò)合適的業(yè)務(wù)線拆分項(xiàng)目,進(jìn)行業(yè)務(wù)服務(wù)種類隔離,另一種是通過(guò)用戶群體來(lái)區(qū)分用戶訪問(wèn)哪臺(tái)服務(wù)器,可以是城市劃分(北京的訪問(wèn)北京服務(wù)器)或其他形式。 -
隔離設(shè)計(jì)重點(diǎn)
- 定義好需要隔離業(yè)務(wù)的大小和粒度
- 隔離模式需要配置一些高可用、重試、異步、消息中間件等設(shè)計(jì)的方式配套使用
- 設(shè)計(jì)過(guò)程考慮運(yùn)維的復(fù)雜度,要能駕馭的話,考慮自動(dòng)化運(yùn)維等
- 監(jiān)控系統(tǒng)(重要、重要、重要)
補(bǔ)償機(jī)制
- 補(bǔ)償機(jī)制的前提
針對(duì)補(bǔ)償機(jī)制的出現(xiàn),本質(zhì)上是解決ACID和BASE理論而設(shè)計(jì)的一個(gè)機(jī)制,關(guān)于ACID和BASE理論網(wǎng)上有很多知識(shí),可以說(shuō)是汗牛充棟.
有了對(duì) ACID 和 BASE 的分析,你就可以發(fā)現(xiàn),BASE理論容許系統(tǒng)處于短暫的不可用和不一致的狀態(tài),那么在設(shè)計(jì)的時(shí)候怎么去保證最終的可用和一致?tīng)顟B(tài)呢?這就需要引入補(bǔ)償機(jī)制。
比如: 如果你如打印東西,電子文件拷入u盤(pán),帶到打印店,打印店老板開(kāi)始打印,但是由于你拷錯(cuò)了文件,導(dǎo)致我們文件打印就是不可用的,那這也不會(huì)阻止我們要打印的文件,因?yàn)槲覀兛梢越栌么蛴〉昀习咫娔X登陸郵箱下載下來(lái),退一步來(lái)講,如果郵箱沒(méi)有,那我就取消本次打印,回家整理好,之后再來(lái).這也就說(shuō)明了業(yè)務(wù)流程必須執(zhí)行回滾操作.
如果一個(gè)事務(wù)失敗了或是超時(shí)了,我們需要不斷地重試,努力地達(dá)到我們想要的結(jié)果,然而如果不能達(dá)到這個(gè)結(jié)果, 我們要把整個(gè)業(yè)務(wù)線狀態(tài)恢復(fù)之前的狀態(tài), 如果有部分業(yè)務(wù)變化, 我們要把變化的數(shù)據(jù)更新回原來(lái)的狀態(tài).
一個(gè)好的補(bǔ)償機(jī)制要做以下幾個(gè)方面:
1. 要清楚的知道這個(gè)機(jī)制執(zhí)行后要達(dá)到什么狀態(tài)
2. 當(dāng)補(bǔ)償機(jī)制的代碼運(yùn)作起來(lái),我們可以進(jìn)行并行或串行
3. 對(duì)完成的事務(wù)進(jìn)行修改,可以考慮加一個(gè)修改事務(wù)
看到這里相信你知道補(bǔ)償機(jī)制主要做什么了,補(bǔ)償機(jī)制主要做以下兩件事:
1. 努力把一個(gè)業(yè)務(wù)執(zhí)行完成
2. 如果執(zhí)行不完成,將會(huì)啟動(dòng)一個(gè)補(bǔ)償機(jī)制,回滾業(yè)務(wù)流程
- 補(bǔ)償設(shè)計(jì)重點(diǎn)
- 因?yàn)檠a(bǔ)償機(jī)制是為了努力執(zhí)行一個(gè)業(yè)務(wù)流程,需要這個(gè)流程中所設(shè)計(jì)的方法或接口支持冪等性,并且在上游有重試機(jī)制
- 如果業(yè)務(wù)流程有問(wèn)題,一定要幫我們回滾和補(bǔ)償
- 必須明白,業(yè)務(wù)補(bǔ)償和業(yè)務(wù)邏輯是強(qiáng)業(yè)務(wù)關(guān)聯(lián)的,很難通用
- 針對(duì)不同業(yè)務(wù)考慮不同細(xì)節(jié)(很多細(xì)節(jié)上,是根據(jù)業(yè)務(wù)考慮,望大家一定要考慮好再開(kāi)工)
熔斷機(jī)制
- 熔斷器設(shè)計(jì)思路
設(shè)想一個(gè)場(chǎng)景,用戶的請(qǐng)求調(diào)用服務(wù)A,服務(wù)A調(diào)用服務(wù)B。我們可以把B稱作A的下游服務(wù)。服務(wù)B前面有負(fù)載均衡器。
后端服務(wù)可能因?yàn)楦鞣N原因出問(wèn)題。例如:數(shù)據(jù)庫(kù)慢查詢,網(wǎng)絡(luò)波動(dòng),或者內(nèi)存爭(zhēng)用。在這個(gè)情況下,如果服務(wù)A超時(shí)或者報(bào)錯(cuò),用戶很可能會(huì)重試。在如此混亂的情況下我們可以做什么來(lái)保護(hù)下游服務(wù)呢?
熔斷機(jī)制目的是為了解決資源和失敗率提供更多的控制,這個(gè)機(jī)制最重要的部分是熔斷器能夠快速對(duì)下游服務(wù)作出一些響應(yīng)。線程池不會(huì)因?yàn)槁?qǐng)求而阻塞,沒(méi)有超時(shí),而且也可能會(huì)給終端用戶更有意義的返回?cái)?shù)據(jù)。熔斷器也給了下游服務(wù)足夠的時(shí)間恢復(fù)正常。完全避免報(bào)錯(cuò)是很困難的,但是減少錯(cuò)誤的影響完全可行。
在熔斷機(jī)制中有3種主要的狀態(tài):
- 熔斷器設(shè)計(jì)重點(diǎn)
- 錯(cuò)誤的類型 (針對(duì)不同的錯(cuò)誤,開(kāi)啟不同的容錯(cuò)機(jī)制,有時(shí)候需要多個(gè)機(jī)制配合使用)
- 測(cè)試服務(wù)是否可用(利用心跳來(lái)檢測(cè)遠(yuǎn)程服務(wù)的健康接口)
- 并發(fā)問(wèn)題(針對(duì)同一時(shí)刻斷路器請(qǐng)求調(diào)用的負(fù)擔(dān),一般來(lái)說(shuō)會(huì)有一個(gè)共享數(shù)據(jù)結(jié)構(gòu),會(huì)導(dǎo)致有鎖情況,我們需要改成無(wú)所的數(shù)據(jù)接口,這樣會(huì)更好)
- 手動(dòng)重制(失敗操作的恢復(fù)很難確定,如果斷路器保護(hù)的服務(wù)長(zhǎng)時(shí)間不能用,管理員能夠強(qiáng)制改成斷開(kāi)狀態(tài))
- 資源分區(qū)(針對(duì)下游數(shù)據(jù)層,我們可能做多庫(kù)多表,我們要對(duì)根據(jù)那些數(shù)據(jù)區(qū)域進(jìn)行熔斷,而不是整條業(yè)務(wù)線)
- 監(jiān)控系統(tǒng)(日志監(jiān)控系統(tǒng),重要的性質(zhì)不用多強(qiáng)調(diào))
重試機(jī)制
-
重試機(jī)制的思路
對(duì)上面的熔斷器模型,如果B服務(wù)減小它的實(shí)例數(shù)量,將發(fā)生什么?許多A發(fā)起的請(qǐng)求可能遇到5XX報(bào)錯(cuò)。這將觸發(fā)熔斷器的失敗報(bào)警。這就是為什么我們需要重試以避免間歇性網(wǎng)絡(luò)抽風(fēng)。
所以,我們需要一個(gè)重試的機(jī)制。但是,我們需要明白的是,“重試”的語(yǔ)義是我們認(rèn)為這個(gè)故障是暫時(shí)的,而不是永久的,所以我們會(huì)去重試. -
重試機(jī)制設(shè)計(jì)重點(diǎn)
- 要缺點(diǎn)錯(cuò)誤類型,再做是否需要重試
- 重試的抖動(dòng)數(shù)要根據(jù)業(yè)務(wù)缺點(diǎn),不同的業(yè)務(wù)有不同的考量
- 如果超過(guò)指定次數(shù)和時(shí)間,重試機(jī)制就失去了意義
小結(jié)
好了,關(guān)于容錯(cuò)機(jī)制的多種機(jī)制就簡(jiǎn)單介紹到這里了,還有很多機(jī)制需要大家去通過(guò)業(yè)務(wù)場(chǎng)景進(jìn)行使用,比如:降級(jí)機(jī)制、限流機(jī)制等等,針對(duì)容錯(cuò)技術(shù)上,可以選容錯(cuò)框架(比如:hystrix,雖然已經(jīng)不再維護(hù),但足夠業(yè)務(wù)場(chǎng)景使用)或者是其他的容錯(cuò)框架.你應(yīng)該明白了容錯(cuò)機(jī)制的重要性和必要性,之后再探討其他技術(shù)切入點(diǎn).
總結(jié)
- 上一篇: Codeforces 704D Capt
- 下一篇: DBeaver出现:The Networ