一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡述Golang熔斷器的實(shí)現(xiàn)及使用

馬哥Linux運(yùn)維 ? 來源:Segmentfault ? 作者:搬磚程序員帶你飛 ? 2021-11-26 10:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Go 項(xiàng)目中使用熔斷技術(shù)提高系統(tǒng)容錯(cuò)性。本文介紹了 go 熔斷器和其使用。

熔斷器像是一個(gè)保險(xiǎn)絲。當(dāng)我們依賴的服務(wù)出現(xiàn)問題時(shí),可以及時(shí)容錯(cuò)。一方面可以減少依賴服務(wù)對自身訪問的依賴,防止出現(xiàn)雪崩效應(yīng);另一方面降低請求頻率以方便上游盡快恢復(fù)服務(wù)。

熔斷器的應(yīng)用也非常廣泛。除了在我們應(yīng)用中,為了請求服務(wù)時(shí)使用熔斷器外,在 web 網(wǎng)關(guān)、微服務(wù)中,也有非常廣泛的應(yīng)用。本文將從源碼角度學(xué)習(xí) sony 開源的一個(gè)熔斷器實(shí)現(xiàn) github/sony/gobreaker。(代碼注釋可以從github/lpflpf/gobreaker 查看)

熔斷器的模式

gobreaker 是基于《微軟云設(shè)計(jì)模式》一書中的熔斷器模式的 Golang 實(shí)現(xiàn)。有 sony 公司開源,目前 star 數(shù)有 1.2K。使用人數(shù)較多。

下面是模式定義的一個(gè)狀態(tài)機(jī):

538bb7b4-4e2d-11ec-9eda-dac502259ad0.png

熔斷器有三種狀態(tài),四種狀態(tài)轉(zhuǎn)移的情況:

三種狀態(tài)

  • 熔斷器關(guān)閉狀態(tài),服務(wù)正常訪問

  • 熔斷器開啟狀態(tài),服務(wù)異常

  • 熔斷器半開狀態(tài),部分請求限流訪問

四種狀態(tài)轉(zhuǎn)移

  • 在熔斷器關(guān)閉狀態(tài)下,當(dāng)失敗后并滿足一定條件后,將直接轉(zhuǎn)移為熔斷器開啟狀態(tài)。

  • 在熔斷器開啟狀態(tài)下,如果過了規(guī)定的時(shí)間,將進(jìn)入半開啟狀態(tài),驗(yàn)證目前服務(wù)是否可用。

  • 在熔斷器半開啟狀態(tài)下,如果出現(xiàn)失敗,則再次進(jìn)入關(guān)閉狀態(tài)。

  • 在熔斷器半開啟后,所有請求(有限額)都是成功的,則熔斷器關(guān)閉。所有請求將正常訪問。

gobreaker 的實(shí)現(xiàn)

gobreaker 是在上述狀態(tài)機(jī)的基礎(chǔ)上,實(shí)現(xiàn)的一個(gè)熔斷器。

熔斷器的定義

typeCircuitBreakerstruct{
namestring
maxRequestsuint32//最大請求數(shù)(半開啟狀態(tài)會(huì)限流)
intervaltime.Duration//統(tǒng)計(jì)周期
timeouttime.Duration//進(jìn)入熔斷后的超時(shí)時(shí)間
readyToTripfunc(countsCounts)bool//通過Counts判斷是否開啟熔斷。需要自定義
onStateChangefunc(namestring,fromState,toState)//狀態(tài)修改時(shí)的鉤子函數(shù)

mutexsync.Mutex//互斥鎖,下面數(shù)據(jù)的更新都需要加鎖
stateState//記錄了當(dāng)前的狀態(tài)
generationuint64//標(biāo)記屬于哪個(gè)周期
countsCounts//計(jì)數(shù)器,統(tǒng)計(jì)了成功、失敗、連續(xù)成功、連續(xù)失敗等,用于決策是否進(jìn)入熔斷
expirytime.Time//進(jìn)入下個(gè)周期的時(shí)間
}

其中,如下參數(shù)是我們可以自定義的:

  • MaxRequests:最大請求數(shù)。當(dāng)在最大請求數(shù)下,均請求正常的情況下,會(huì)關(guān)閉熔斷器

  • interval:一個(gè)正常的統(tǒng)計(jì)周期。如果為 0,那每次都會(huì)將計(jì)數(shù)清零

  • timeout: 進(jìn)入熔斷后,可以再次請求的時(shí)間

  • readyToTrip:判斷熔斷生效的鉤子函數(shù)

  • onStateChagne:狀態(tài)變更的鉤子函數(shù)

請求的執(zhí)行

熔斷器的執(zhí)行操作,主要包括三個(gè)階段;①請求之前的判定;②服務(wù)的請求執(zhí)行;③請求后的狀態(tài)和計(jì)數(shù)的更新

//熔斷器的調(diào)用
func(cb*CircuitBreaker)Execute(reqfunc()(interface{},error))(interface{},error){

//①請求之前的判斷
generation,err:=cb.beforeRequest()
iferr!=nil{
returnnil,err
}

deferfunc(){
e:=recover()
ife!=nil{
//③panic的捕獲
cb.afterRequest(generation,false)
panic(e)
}
}()

//②請求和執(zhí)行
result,err:=req()

//③更新計(jì)數(shù)
cb.afterRequest(generation,err==nil)
returnresult,err
}

請求之前的判定操作

請求之前,會(huì)判斷當(dāng)前熔斷器的狀態(tài)。如果熔斷器以開啟,則不會(huì)繼續(xù)請求。如果熔斷器半開,并且已達(dá)到最大請求閾值,也不會(huì)繼續(xù)請求。

func(cb*CircuitBreaker)beforeRequest()(uint64,error){
cb.mutex.Lock()
defercb.mutex.Unlock()

now:=time.Now()
state,generation:=cb.currentState(now)

ifstate==StateOpen{//熔斷器開啟,直接返回
returngeneration,ErrOpenState
}elseifstate==StateHalfOpen&&cb.counts.Requests>=cb.maxRequests{//如果是半打開的狀態(tài),并且請求次數(shù)過多了,則直接返回
returngeneration,ErrTooManyRequests
}

cb.counts.onRequest()
returngeneration,nil
}

其中當(dāng)前狀態(tài)的計(jì)算,是依據(jù)當(dāng)前狀態(tài)來的。如果當(dāng)前狀態(tài)為已開啟,則判斷是否已經(jīng)超時(shí),超時(shí)就可以變更狀態(tài)到半開;如果當(dāng)前狀態(tài)為關(guān)閉狀態(tài),則通過周期判斷是否進(jìn)入下一個(gè)周期。

func(cb*CircuitBreaker)currentState(nowtime.Time)(State,uint64){
switchcb.state{
caseStateClosed:
if!cb.expiry.IsZero()&&cb.expiry.Before(now){//是否需要進(jìn)入下一個(gè)計(jì)數(shù)周期
cb.toNewGeneration(now)
}
caseStateOpen:
ifcb.expiry.Before(now){
//熔斷器由開啟變更為半開
cb.setState(StateHalfOpen,now)
}
}
returncb.state,cb.generation
}

周期長度的設(shè)定,也是以據(jù)當(dāng)前狀態(tài)來的。如果當(dāng)前正常(熔斷器關(guān)閉),則設(shè)置為一個(gè) interval 的周期;如果當(dāng)前熔斷器是開啟狀態(tài),則設(shè)置為超時(shí)時(shí)間(超時(shí)后,才能變更為半開狀態(tài))。

請求之后的處理操作

每次請求之后,會(huì)通過請求結(jié)果是否成功,對熔斷器做計(jì)數(shù)。

func(cb*CircuitBreaker)afterRequest(beforeuint64,successbool){
cb.mutex.Lock()
defercb.mutex.Unlock()

now:=time.Now()

//如果不在一個(gè)周期,就不再計(jì)數(shù)
state,generation:=cb.currentState(now)
ifgeneration!=before{
return
}

ifsuccess{
cb.onSuccess(state,now)
}else{
cb.onFailure(state,now)
}
}

如果在半開的狀態(tài)下:

  • 如果請求成功,則會(huì)判斷當(dāng)前連續(xù)成功的請求數(shù) 大于等于 maxRequests, 則可以把狀態(tài)由半開狀態(tài)轉(zhuǎn)移為關(guān)閉狀態(tài)

  • 如果在半開狀態(tài)下,請求失敗,則會(huì)直接將半開狀態(tài)轉(zhuǎn)移為開啟狀態(tài)

如果在關(guān)閉狀態(tài)下:

  • 如果請求成功,則計(jì)數(shù)更新

  • 如果請求失敗,則調(diào)用 readyToTrip 判斷是否需要將狀態(tài)關(guān)閉狀態(tài)轉(zhuǎn)移為開啟狀態(tài)

總結(jié)

  • 對于頻繁請求一些遠(yuǎn)程或者第三方的不可靠的服務(wù),存在失敗的概率還是非常大的。使用熔斷器的好處就是可以是我們自身的服務(wù)不被這些不可靠的服務(wù)拖垮,造成雪崩。

  • 由于熔斷器里面,不僅會(huì)維護(hù)不少的統(tǒng)計(jì)數(shù)據(jù),還有互斥鎖做資源隔離,成本也會(huì)不少。

  • 在半開狀態(tài)下,可能出現(xiàn)請求過多的情況。這是由于半開狀態(tài)下,連續(xù)請求成功的數(shù)量未達(dá)到最大請求值。所以,熔斷器對于請求時(shí)間過長(但是比較頻繁)的服務(wù)可能會(huì)造成大量的 too many requests 錯(cuò)誤

轉(zhuǎn)自:segmentfault.com/a/1190000023033343

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7254

    瀏覽量

    91793
  • 熔斷器
    +關(guān)注

    關(guān)注

    6

    文章

    494

    瀏覽量

    32190
  • go語言
    +關(guān)注

    關(guān)注

    1

    文章

    159

    瀏覽量

    9363

原文標(biāo)題:Golang 熔斷器的實(shí)現(xiàn)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何實(shí)現(xiàn)跌落式熔斷器的自動(dòng)化控制

    實(shí)現(xiàn)跌落式熔斷器的自動(dòng)化控制,可以通過以下技術(shù)和步驟進(jìn)行: 一、技術(shù)原理 跌落式熔斷器的工作原理是將熔絲穿入熔管內(nèi),當(dāng)被保護(hù)線路發(fā)生故障時(shí),故障電流使熔絲熔斷,形成電弧。消弧管在電弧高
    的頭像 發(fā)表于 02-05 10:46 ?661次閱讀

    跌落式熔斷器常見故障及解決方法

    在電力系統(tǒng)中,跌落式熔斷器是一種重要的保護(hù)設(shè)備,它能夠在電流超過設(shè)定值時(shí)自動(dòng)斷開電路,從而保護(hù)線路和設(shè)備不受損害。然而,由于各種原因,跌落式熔斷器可能會(huì)出現(xiàn)故障,影響其正常工作。 一、常見故障
    的頭像 發(fā)表于 02-05 10:41 ?1212次閱讀

    跌落式熔斷器與傳統(tǒng)熔斷器對比

    熔斷器主要由熔絲管、熔絲、絕緣子和操作機(jī)構(gòu)組成。熔絲管通常由玻璃或其他耐熱材料制成,內(nèi)部裝有熔絲。當(dāng)電流超過設(shè)定值時(shí),熔絲會(huì)熔斷,熔絲管隨之跌落,實(shí)現(xiàn)電路的斷開。 傳統(tǒng)熔斷器: 傳統(tǒng)
    的頭像 發(fā)表于 02-05 10:39 ?850次閱讀

    如何選擇合適的跌落式熔斷器

    在電力系統(tǒng)中,跌落式熔斷器是一種重要的保護(hù)設(shè)備,它能夠在電路發(fā)生短路或過載時(shí)自動(dòng)斷開電路,從而保護(hù)線路和設(shè)備不受損害。 1. 了解熔斷器的基本原理 跌落式熔斷器的工作原理是利用熔絲在過載或短路時(shí)產(chǎn)生
    的頭像 發(fā)表于 02-05 10:38 ?760次閱讀

    跌落式熔斷器安裝注意事項(xiàng)

    跌落式熔斷器是一種用于保護(hù)電力線路和設(shè)備的過電流保護(hù)裝置,它通過自動(dòng)斷開電路來防止過載和短路造成的損害。以下是關(guān)于跌落式熔斷器安裝的一些注意事項(xiàng): 1. 選擇合適的熔斷器 額定電壓和電流 :確保
    的頭像 發(fā)表于 02-05 10:14 ?875次閱讀

    熔斷器式隔離開關(guān)的組成,熔斷器式隔離開關(guān)的熔斷器是并聯(lián)還是串聯(lián)

    熔斷器式隔離開關(guān)是一種集成了隔離開關(guān)和熔斷器功能的電器設(shè)備,通常由以下幾個(gè)關(guān)鍵部分組成:
    的頭像 發(fā)表于 01-29 14:12 ?6349次閱讀

    熔斷器測試解決方案

    一、 熔斷器簡介? 熔斷器是通過電流超過規(guī)定值一段時(shí)間后,利用其自身產(chǎn)生的熱量使熔體熔化,從而斷開電路。當(dāng)電路發(fā)生短路或過載時(shí),過電流的熱效應(yīng)使熔體熔化、氣化產(chǎn)生斷口,斷口產(chǎn)生電弧,熔斷器通過熄滅
    的頭像 發(fā)表于 01-13 10:35 ?726次閱讀
    <b class='flag-5'>熔斷器</b>測試解決方案

    熔斷器的耐壓測試方法

    熔斷器是電力系統(tǒng)中不可或缺的保護(hù)元件,其主要作用是在電路出現(xiàn)過載或短路時(shí)迅速斷開電路,以保護(hù)電路和設(shè)備的安全。耐壓測試是評估熔斷器絕緣性能的重要手段,通過模擬實(shí)際工作條件下的電壓應(yīng)力,檢驗(yàn)熔斷器
    的頭像 發(fā)表于 12-10 11:09 ?1400次閱讀

    如何測試熔斷器是否正常 工業(yè)用熔斷器的應(yīng)用場景

    如何測試熔斷器是否正常 1. 視覺檢查 首先,進(jìn)行熔斷器的外觀檢查。檢查熔斷器是否有任何明顯的損壞,如裂紋、變形或燒焦的痕跡。熔斷器的外殼應(yīng)該完整無損,沒有破損。 2. 斷路測試 斷路
    的頭像 發(fā)表于 12-10 11:05 ?2538次閱讀

    不同類型熔斷器的優(yōu)缺點(diǎn) 熔斷器在電路中的作用

    不同類型熔斷器的優(yōu)缺點(diǎn) 插入式熔斷器 優(yōu)點(diǎn) :常用于380V及以下電壓等級(jí)的線路末端,作為配電支線或電氣設(shè)備的短路保護(hù),使用便捷。 缺點(diǎn) :相較于其他類型,其分?jǐn)嗄芰瓦m用范圍可能較為有限。 螺旋式
    的頭像 發(fā)表于 12-10 10:49 ?2159次閱讀

    常見熔斷器故障及維修方法

    常見熔斷器故障 熔斷器頻繁熔斷 這是最常見的故障之一,可能是由于電路過載、熔斷器額定電流選擇不當(dāng)或電路中存在短路等原因引起的。 熔斷器
    的頭像 發(fā)表于 12-10 10:30 ?3185次閱讀

    熔斷器的工作原理 熔斷器和斷路的區(qū)別

    熔斷器的工作原理 熔斷器是一種過電流保護(hù)裝置,其工作原理基于電流的熱效應(yīng)。熔斷器內(nèi)部有一個(gè)熔絲或熔片,通常由低熔點(diǎn)金屬制成,如鉛錫合金或鋅合金。當(dāng)電路中的電流超過熔斷器的額定電流時(shí),熔
    的頭像 發(fā)表于 12-10 10:28 ?2676次閱讀

    工業(yè)熔斷器的應(yīng)用及優(yōu)勢

    在現(xiàn)代工業(yè)生產(chǎn)中,電氣系統(tǒng)的安全穩(wěn)定運(yùn)行至關(guān)重要。工業(yè)熔斷器作為一種簡單而有效的保護(hù)裝置,廣泛應(yīng)用于各種電氣設(shè)備和系統(tǒng)中,以確保在異常情況下能夠迅速切斷電流,防止設(shè)備損壞和事故的發(fā)生。 工業(yè)熔斷器
    的頭像 發(fā)表于 11-24 16:48 ?2113次閱讀

    熔斷器的工作原理介紹 熔斷器與保險(xiǎn)絲的區(qū)別

    熔斷器的工作原理 電流感應(yīng) :當(dāng)電路中的電流超過熔斷器的額定電流時(shí),熔斷器內(nèi)部的金屬導(dǎo)體會(huì)開始發(fā)熱。 熱量積累 :隨著電流的持續(xù),金屬導(dǎo)體積累的熱量會(huì)逐漸增加。 熔斷動(dòng)作 :當(dāng)金屬導(dǎo)體
    的頭像 發(fā)表于 11-24 16:39 ?3954次閱讀

    低壓熔斷器的基本構(gòu)造與類型選擇

    一、低壓熔斷器的基本構(gòu)造 熔斷器的核心組成部分包括熔體、熔管和熔座。熔體是熔斷器的關(guān)鍵部分,通常由金屬或合金制成,其熔點(diǎn)較低,能夠在電流超過一定閾值時(shí)迅速熔化,從而切斷電路。熔管則用于安裝熔體,同時(shí)
    的頭像 發(fā)表于 08-20 17:26 ?1851次閱讀