chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

熔斷器的模式

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

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

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

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

三種狀態(tài)

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

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

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

四種狀態(tài)轉移

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

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

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

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

gobreaker 的實現(xiàn)

gobreaker 是在上述狀態(tài)機的基礎上,實現(xiàn)的一個熔斷器。

熔斷器的定義

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

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

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

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

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

  • timeout: 進入熔斷后,可以再次請求的時間

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

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

請求的執(zhí)行

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

//熔斷器的調用
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()

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

請求之前的判定操作

請求之前,會判斷當前熔斷器的狀態(tài)。如果熔斷器以開啟,則不會繼續(xù)請求。如果熔斷器半開,并且已達到最大請求閾值,也不會繼續(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
}

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

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

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

請求之后的處理操作

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

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

now:=time.Now()

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

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

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

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

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

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

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

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

總結

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

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

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

轉自:segmentfault.com/a/1190000023033343

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

    關注

    8

    文章

    7317

    瀏覽量

    94107
  • 熔斷器
    +關注

    關注

    6

    文章

    516

    瀏覽量

    33086
  • go語言
    +關注

    關注

    1

    文章

    159

    瀏覽量

    9644

原文標題:Golang 熔斷器的實現(xiàn)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    828系列高壓管狀熔斷器:緊湊汽車電子應用的理想之選

    828系列高壓管狀熔斷器:緊湊汽車電子應用的理想之選 在電子工程師的日常設計工作中,熔斷器是保障電路安全的關鍵元件。今天,我們就來深入了解一下Littelfuse的828系列高壓管狀熔斷器,看看它在
    的頭像 發(fā)表于 12-16 15:10 ?74次閱讀

    探索POWR - SPEED? Fuse ESR系列高速方形體熔斷器的卓越性能

    探索POWR - SPEED? Fuse ESR系列高速方形體熔斷器的卓越性能 在電子工程領域,熔斷器作為電路保護的關鍵元件,其性能直接關系到整個系統(tǒng)的穩(wěn)定性和安全性。今天,我們就來深入了解一下
    的頭像 發(fā)表于 12-16 10:30 ?73次閱讀

    威可特熔斷器 VGT 延時型 Class G 通用熔斷器

    Vicfuse通用熔斷器ClassG系列VGT(延時型),依據(jù)UL248-5標準設計,通過CE、UL、RoHS認證。屬延時限流型熔斷器,廣泛用于照明、加熱等分支電路保護。電壓覆蓋600VAC
    發(fā)表于 07-16 14:31 ?0次下載

    基于IEC60127-7標準儲能系統(tǒng)的保護熔斷器選型指南

    引言:IEC在2021年12月發(fā)布了電池及電池系統(tǒng)保護熔斷器標準IEC60127-7(Ed1.0),其中包括:1、熔斷器額定電壓達到了1500VDC及以上2、熔斷器的額定電流達到了5000A;3
    的頭像 發(fā)表于 07-15 17:48 ?1495次閱讀
    基于IEC60127-7標準儲能系統(tǒng)的保護<b class='flag-5'>熔斷器</b>選型指南

    基于IEC60127-7標準儲能系統(tǒng)保護熔斷器選型

    引言:IEC在2021年12月發(fā)布了電池及電池系統(tǒng)保護熔斷器標準IEC60127-7(Ed1.0), 其中包括: 1)熔斷器額定電壓達到了1500VDC及以上 2)熔斷器的額定電流達到了5000A
    的頭像 發(fā)表于 07-07 15:24 ?968次閱讀
    基于IEC60127-7標準儲能系統(tǒng)保護<b class='flag-5'>熔斷器</b>選型

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

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

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

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

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

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

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

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

    跌落式熔斷器安裝注意事項

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

    跌落式熔斷器應用領域

    電力系統(tǒng)是現(xiàn)代社會的基礎設施,其穩(wěn)定性和可靠性對于經(jīng)濟發(fā)展和人民生活至關重要。為了確保電力系統(tǒng)的安全運行,各種保護設備被廣泛應用于電力系統(tǒng)中,其中跌落式熔斷器因其獨特的優(yōu)勢而備受關注。 1. 配電網(wǎng)
    的頭像 發(fā)表于 02-05 10:12 ?1415次閱讀

    跌落式熔斷器規(guī)格與性能

    在電力系統(tǒng)中,保護設備免受過載和短路損害至關重要。跌落式熔斷器作為一種經(jīng)濟、可靠的保護裝置,廣泛應用于配電網(wǎng)和輸電網(wǎng)中。 1. 工作原理 跌落式熔斷器的工作原理基于金屬絲(通常為銅或銀)的熔斷特性
    的頭像 發(fā)表于 02-05 10:09 ?1841次閱讀

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

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

    熔斷器式隔離開關工作原理,熔斷器式隔離開關怎么打開

    熔斷器式隔離開關的工作原理主要基于電流的熱效應原理,即在電流超過規(guī)定值一定時間后,熔斷器內部熔體會因其自身產(chǎn)生的熱量而熔化,從而使電路斷開,達到保護電路和設備的目的。
    的頭像 發(fā)表于 01-29 14:09 ?4417次閱讀

    熔斷器測試解決方案

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