自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

服務(wù)熔斷是指什么?你知道嗎?

開發(fā) 架構(gòu)
服務(wù)熔斷是一種軟件設(shè)計(jì)模式,用于分布式系統(tǒng)中處理服務(wù)調(diào)用失敗的情況,可以防止被調(diào)用服務(wù)因?yàn)轭l繁失敗被壓垮。它借鑒了電路中的斷路器原理,通過監(jiān)控服務(wù)調(diào)用的失敗率等條件來決定是否阻止進(jìn)一步的調(diào)用,以保護(hù)系統(tǒng)免受過載。

微服務(wù)領(lǐng)域里有個(gè)詞叫服務(wù)熔斷,你知道這是啥不?
故事要從我讀大學(xué)那會(huì)說起。
因?yàn)楣β蕟栴},很多寢室都是不讓用吹風(fēng)筒和熱水壺的。
但我那時(shí)候頭鐵,不僅用,而且還同時(shí)開了兩個(gè)熱水壺和一個(gè)吹風(fēng)筒。直接給寢室電路來了個(gè)壓測(cè)。
不出意外的出了意外,寢室直接停電。
一時(shí)間,隔壁寢室燈火通明,我們寢室一片漆黑。
作為本科專業(yè)電氣工程的靚仔,我們意識(shí)到,這妥妥是電路過載導(dǎo)致斷路器跳閘了。
于是我們趁社管阿姨不注意,偷偷摸進(jìn)配電房,手動(dòng)將斷路器開關(guān)復(fù)位,寢室就來電了。

是真的有驚無險(xiǎn)。
如果沒有這個(gè)斷路器,寢室總電路怕是得因?yàn)檫^載全部燒掉,我們幾個(gè)妥妥會(huì)提前進(jìn)入社會(huì)大學(xué)。
我能畢業(yè),全靠這個(gè)斷路器!
看到這里,我們知道了斷路器的作用,就是在電路出問題的時(shí)候及時(shí)斷開電路,避免過載,從而保護(hù)電路。
在微服務(wù)領(lǐng)域,我們也可以借鑒斷路器的思路,引入了服務(wù)熔斷的概念。

服務(wù)熔斷是什么

服務(wù)熔斷,也就是 Circuit Breaker,本質(zhì)上是一種軟件設(shè)計(jì)模式,用于在分布式系統(tǒng)中處理服務(wù)調(diào)用失敗的情況。

假設(shè)有個(gè) A 服務(wù)調(diào)用 B 服務(wù)的場(chǎng)景,如果 B 服務(wù)已經(jīng)出現(xiàn)頻繁失敗的情況,A 繼續(xù)調(diào)用只會(huì)加劇 B 服務(wù)的負(fù)擔(dān),嚴(yán)重的時(shí)候,有可能導(dǎo)致 B 服務(wù)崩潰,甚至出現(xiàn) B 服務(wù)重啟后立馬被打崩的情況。因此,最好的做法是,在一段時(shí)間內(nèi)先不要再頻繁調(diào)用 B 服務(wù)。

為了實(shí)現(xiàn)這個(gè)保護(hù)效果,我們可以在 A 和 B 之間加一個(gè)熔斷器。當(dāng) B 服務(wù)頻繁失敗時(shí),熔斷器可以防止 A 繼續(xù)頻繁調(diào)用 B 服務(wù),相當(dāng)于阻斷服務(wù)間的請(qǐng)求,并且還能在 B 服務(wù)恢復(fù)正常之后,恢復(fù) A 對(duì) B 的調(diào)用。

熔斷器的作用

工作原理也和上文提到的宿舍電路里的斷路器類似。當(dāng)服務(wù)調(diào)用失敗的次數(shù)超過某個(gè)閾值時(shí),熔斷器會(huì)自動(dòng)“打開”(Open),阻止進(jìn)一步的服務(wù)調(diào)用,防止不斷報(bào)錯(cuò)重試導(dǎo)致壓垮被調(diào)用服務(wù)。

然后在在一段時(shí)間之后,熔斷器開始嘗試允許少量的請(qǐng)求通過,以檢查服務(wù)是否已經(jīng)恢復(fù),也就是所謂的“半打開”(HalfOpen)。

如果這些請(qǐng)求成功,熔斷器會(huì)“關(guān)閉”(Close),系統(tǒng)恢復(fù)正常的服務(wù)調(diào)用;但如果調(diào)用還是失敗,那熔斷器會(huì)繼續(xù)再次回到“打開”(Open)狀態(tài)。

上面提到的三個(gè)狀態(tài)Open,HalfOpen和Close是服務(wù)熔斷中非常重要的三個(gè)狀態(tài)。

  •  Closed(關(guān)閉):這是熔斷器的初始狀態(tài)。在這種狀態(tài)下,可以進(jìn)行服務(wù)間調(diào)用,熔斷器會(huì)跟蹤服務(wù)調(diào)用的成功和失敗情況。如果失敗調(diào)用次數(shù),到了某個(gè)配置的閾值,熔斷器就會(huì)切換到 Open(打開)狀態(tài)。

熔斷器關(guān)閉

  • HalfOpen(半開):保持 Open 狀態(tài)一段時(shí)間后,熔斷器會(huì)嘗試進(jìn)入 HalfOpen 狀態(tài)。這個(gè)狀態(tài)下,熔斷器會(huì)嘗試放幾個(gè)請(qǐng)求通過,看下被調(diào)用服務(wù)是否已經(jīng)恢復(fù)。如果這些請(qǐng)求成功,熔斷器就會(huì)回到 Closed 狀態(tài);如果失敗,那它會(huì)退回到 Open 狀態(tài)。

熔斷器半打開

  •  Open(打開):當(dāng)熔斷器檢測(cè)到服務(wù)調(diào)用連續(xù)失敗時(shí),它會(huì)切換到 Open 狀態(tài)。在這種狀態(tài)下,熔斷器會(huì)阻止所有對(duì)服務(wù)的調(diào)用,直到超時(shí)時(shí)間過后,或者在 HalfOpen 狀態(tài)下的探測(cè)請(qǐng)求成功。

熔斷器打開

它們的狀態(tài)流轉(zhuǎn)關(guān)系就像下圖這樣。

熔斷狀態(tài)機(jī)

怎么使用熔斷器?

可以看出,熔斷器的邏輯其實(shí)很簡(jiǎn)單,而且這么通用的功能,必然有現(xiàn)成的庫可以直接拿來用。
比如阿里開源的sentinel-golang
使用也比較簡(jiǎn)單。只需要三步。

1.引入 circuitbreaker 庫

"github.com/alibaba/sentinel-golang/core/circuitbreaker"

2.聲明熔斷規(guī)則

通過circuitbreaker.LoadRules加載對(duì)應(yīng)的熔斷規(guī)則。

_, err = circuitbreaker.LoadRules([]*circuitbreaker.Rule{
        // Statistic time span=5s, recoveryTimeout=3s, maxErrorRatio=40%
        {
            Resource:                     "api_url",
            Strategy:                     circuitbreaker.ErrorRatio,
            RetryTimeoutMs:               3000,
            MinRequestAmount:             10,
            StatIntervalMs:               5000,
            StatSlidingWindowBucketCount: 10,
            Threshold:                    0.4,
        },
    })

這里面有幾個(gè)需要注意的地方:

  •  Resource 是想要保護(hù)的資源名稱,也就是上面提到的 B 服務(wù),這里可以直接使用被調(diào)用方的 url。
  •  Strategy 是指熔斷策略,示例代碼里展示的是錯(cuò)誤率,也就是說服務(wù)達(dá)到 xx 比例的錯(cuò)誤率時(shí)就會(huì)觸發(fā)熔斷。同時(shí)這里還支持填其他策略,比如從錯(cuò)誤率換成錯(cuò)誤次數(shù)或者是慢調(diào)用的比例個(gè)數(shù)。
  •  RetryTimeoutMs 是指熔斷器打開后經(jīng)過多長時(shí)間后進(jìn)行重試。在熔斷器 Open 期間,請(qǐng)求會(huì)被直接拒絕,不會(huì)發(fā)送到后端 Resource(B 服務(wù))。在指定的超時(shí)時(shí)間之后,熔斷器將嘗試發(fā)送一個(gè)請(qǐng)求以檢查后端資源的可用性。
  •  MinRequestAmount 表示在進(jìn)行熔斷之前必須滿足的最小請(qǐng)求數(shù)量。只有當(dāng)請(qǐng)求的數(shù)量達(dá)到或超過這個(gè)閾值時(shí),熔斷器才會(huì)生效。這個(gè)參數(shù)可以用來避免在系統(tǒng)啟動(dòng)時(shí)就觸發(fā)熔斷。
  •  StatIntervalMs 表示統(tǒng)計(jì)信息的時(shí)間間隔,以毫秒為單位。在這個(gè)時(shí)間間隔內(nèi),熔斷器將收集請(qǐng)求的統(tǒng)計(jì)信息,用于計(jì)算錯(cuò)誤率。
  •  Threshold:表示錯(cuò)誤率的閾值。當(dāng)錯(cuò)誤率超過這個(gè)閾值時(shí),熔斷器將觸發(fā)熔斷,停止發(fā)送請(qǐng)求到后端資源。

3.加入熔斷保護(hù)

在需要進(jìn)行熔斷保護(hù)的地方,加入下面的代碼:

e, b := sentinel.Entry("api_url")
        if b == nil {
            // 通過檢測(cè),不需要熔斷,直接執(zhí)行api調(diào)用
            err := api_call()
            if err != nil {
                sentinel.TraceError(e, err)
            }
            // 保證執(zhí)行完之后退出資源
            e.Exit()
        }

上面的 sentinel.Entry()方法內(nèi)部會(huì)自動(dòng)檢測(cè)"api_url"這個(gè)資源是否需要打開熔斷器,如果 api 調(diào)用報(bào)錯(cuò)了,可以通過 sentinel.TraceError 記錄下來,sentinel 內(nèi)部會(huì)根據(jù)報(bào)錯(cuò)去計(jì)算報(bào)錯(cuò)率,自動(dòng)判斷要不要熔斷。

到這里,就算使用上熔斷器的能力啦。

總結(jié)

  • 服務(wù)熔斷是一種軟件設(shè)計(jì)模式,用于分布式系統(tǒng)中處理服務(wù)調(diào)用失敗的情況,可以防止被調(diào)用服務(wù)因?yàn)轭l繁失敗被壓垮。它借鑒了電路中的斷路器原理,通過監(jiān)控服務(wù)調(diào)用的失敗率等條件來決定是否阻止進(jìn)一步的調(diào)用,以保護(hù)系統(tǒng)免受過載。
  • 服務(wù)熔斷器有三個(gè)主要狀態(tài):關(guān)閉(Closed)、半開(HalfOpen)和打開(Open),分別對(duì)應(yīng)不同的保護(hù)策略。當(dāng)服務(wù)調(diào)用失敗次數(shù)超過閾值時(shí),熔斷器打開,阻止服務(wù)調(diào)用。在一定時(shí)間后,熔斷器嘗試半開狀態(tài),允許少量請(qǐng)求通過以測(cè)試服務(wù)恢復(fù)情況。如果服務(wù)恢復(fù),熔斷器關(guān)閉;如果失敗,熔斷器保持打開狀態(tài)。
  • 在 go 語言里可以使用 sentinel-golang 庫實(shí)現(xiàn)熔斷功能。
責(zé)任編輯:姜華 來源: 小白debug
相關(guān)推薦

2023-12-20 08:23:53

NIO組件非阻塞

2024-07-30 08:22:47

API前端網(wǎng)關(guān)

2024-11-08 09:48:38

異步編程I/O密集

2022-11-28 00:04:17

2024-01-15 12:16:37

2024-06-27 10:51:28

生成式AI領(lǐng)域

2023-07-11 00:12:05

2024-02-19 07:44:52

虛擬機(jī)Java平臺(tái)

2023-03-06 16:38:30

SQL數(shù)據(jù)庫

2024-04-30 09:02:48

2023-01-04 11:39:45

2022-11-07 17:23:03

2024-05-30 09:55:05

人工智能AGI領(lǐng)域

2024-06-11 09:02:30

2022-12-06 10:04:59

5G網(wǎng)絡(luò)C波段

2024-08-20 08:29:55

2024-04-07 00:00:03

2024-10-10 16:53:53

守護(hù)線程編程

2015-10-23 09:34:16

2024-10-05 00:00:00

HTTPS性能HTTP/2
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)