在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

簡述Golang熔斷器的實現及使用

馬哥Linux運維 ? 來源:Segmentfault ? 作者:搬磚程序員帶你飛 ? 2021-11-26 10:08 ? 次閱讀

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

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

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

熔斷器的模式

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

下面是模式定義的一個狀態機:

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

熔斷器有三種狀態,四種狀態轉移的情況:

三種狀態

  • 熔斷器關閉狀態,服務正常訪問

  • 熔斷器開啟狀態,服務異常

  • 熔斷器半開狀態,部分請求限流訪問

四種狀態轉移

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

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

  • 在熔斷器半開啟狀態下,如果出現失敗,則再次進入關閉狀態。

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

gobreaker 的實現

gobreaker 是在上述狀態機的基礎上,實現的一個熔斷器。

熔斷器的定義

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

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

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

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

  • interval:一個正常的統計周期。如果為 0,那每次都會將計數清零

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

  • readyToTrip:判斷熔斷生效的鉤子函數

  • onStateChagne:狀態變更的鉤子函數

請求的執行

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

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

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

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

請求之前的判定操作

請求之前,會判斷當前熔斷器的狀態。如果熔斷器以開啟,則不會繼續請求。如果熔斷器半開,并且已達到最大請求閾值,也不會繼續請求。

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{//如果是半打開的狀態,并且請求次數過多了,則直接返回
returngeneration,ErrTooManyRequests
}

cb.counts.onRequest()
returngeneration,nil
}

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

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

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

請求之后的處理操作

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

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

now:=time.Now()

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

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

如果在半開的狀態下:

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

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

如果在關閉狀態下:

  • 如果請求成功,則計數更新

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

總結

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

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

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

轉自:segmentfault.com/a/1190000023033343

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

    關注

    8

    文章

    7117

    瀏覽量

    89339
  • 熔斷器
    +關注

    關注

    6

    文章

    476

    瀏覽量

    31639
  • go語言
    +關注

    關注

    1

    文章

    158

    瀏覽量

    9063

原文標題:Golang 熔斷器的實現

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

收藏 人收藏

    評論

    相關推薦

    熔斷器測試解決方案

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

    熔斷器的耐壓測試方法

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

    如何測試熔斷器是否正常 工業用熔斷器的應用場景

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

    不同類型熔斷器的優缺點 熔斷器在電路中的作用

    不同類型熔斷器的優缺點 插入式熔斷器 優點 :常用于380V及以下電壓等級的線路末端,作為配電支線或電氣設備的短路保護,使用便捷。 缺點 :相較于其他類型,其分斷能力和適用范圍可能較為有限。 螺旋式
    的頭像 發表于 12-10 10:49 ?605次閱讀

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

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

    熔斷器的工作原理 熔斷器和斷路的區別

    熔斷器的工作原理 熔斷器是一種過電流保護裝置,其工作原理基于電流的熱效應。熔斷器內部有一個熔絲或熔片,通常由低熔點金屬制成,如鉛錫合金或鋅合金。當電路中的電流超過熔斷器的額定電流時,熔
    的頭像 發表于 12-10 10:28 ?863次閱讀

    熔斷器的工作原理介紹 熔斷器與保險絲的區別

    熔斷器的工作原理 電流感應 :當電路中的電流超過熔斷器的額定電流時,熔斷器內部的金屬導體會開始發熱。 熱量積累 :隨著電流的持續,金屬導體積累的熱量會逐漸增加。 熔斷動作 :當金屬導體
    的頭像 發表于 11-24 16:39 ?1198次閱讀

    低壓熔斷器的基本構造與類型選擇

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

    熔斷器在電路中起什么保護作用

    熔斷器是一種電氣保護裝置,廣泛應用于電力系統和各種電氣設備中。它主要由熔絲或熔片組成,當電路中的電流超過熔斷器的額定電流時,熔絲或熔片會迅速熔斷,切斷電路,從而起到保護電路和設備的作用。 一、
    的頭像 發表于 07-13 15:00 ?3716次閱讀

    熔斷器主要由什么組成? 熔斷器的作用是什么保護

    熔斷器是電力系統中常見的一種安全裝置,用于保護電氣設備和電力系統設施免受電流過載或故障電流引起的損壞。它主要由熔斷器體、熔斷器芯和觸發機構等組成。 熔斷器是一種電器設備,它主要用于保護
    的頭像 發表于 02-26 09:39 ?6312次閱讀

    熔斷式隔離開關是什么?熔斷器式隔離開關與隔離開關熔斷器組的區別

    熔斷式隔離開關是什么?熔斷器式隔離開關與隔離開關熔斷器組的區別? 熔斷式隔離開關是一種常見的電氣設備,用于切斷電路和隔離電器設備。它能夠在緊急情況下迅速切斷電流,保護設備和人身安全。在
    的頭像 發表于 02-06 10:08 ?6826次閱讀

    熔斷器有幾種形式 熔斷器的滅弧方法有哪幾種?

    熔斷器有幾種形式 熔斷器的滅弧方法有哪幾種? 熔斷器是一種用來保護電路免受過電流和過負荷的損壞的電器設備。它們在電力系統和電子設備中廣泛應用,也被稱為電氣保險絲。熔斷器有多種形式,滅弧
    的頭像 發表于 02-06 10:08 ?2579次閱讀

    熔斷器的滅弧方法有哪幾種 使用高壓熔斷器應該注意哪些問題?

    強迫熄弧法:這種方法通過在熔斷器中引入一個與工頻電源頻率相反的電流,從而在熔斷器中產生一個與工頻電源頻率相反的磁場,使熔斷器中的氣體發生電離,形成電弧。
    的頭像 發表于 02-05 15:24 ?2729次閱讀
    <b class='flag-5'>熔斷器</b>的滅弧方法有哪幾種 使用高壓<b class='flag-5'>熔斷器</b>應該注意哪些問題?

    “限流”型熔斷器和“非限流”型熔斷器有何區別?

    “限流”型熔斷器和“非限流”型熔斷器有何區別? 熔斷器是一種在分布式系統中用于處理容錯的重要技術。它可以用于保護應用程序免受由于服務失效等原因引起的故障。在分布式系統中,熔斷器作為一個
    的頭像 發表于 02-05 15:23 ?2822次閱讀

    熔斷器與斷路的區別 斷路能否完全取代熔斷器

    熔斷器與斷路的區別 斷路能否完全取代熔斷器熔斷器與斷路是電力系統中常見的保護設備,它們
    的頭像 發表于 02-05 13:45 ?4719次閱讀
    主站蜘蛛池模板: 久久午夜精品视频| 亚洲swag精品自拍一区| 狼人 成人 综合 亚洲| 日本免费黄色网址| 精品免费| 激情五月综合婷婷| 痴女中文字幕在线视频| 亚洲久久在线| 奇米社区| 在线看免费视频| 亚洲码欧美码一区二区三区| 男女视频在线| 午夜理伦| 欧美xxxx色视频在线观看| 狠狠色狠狠色综合网| 伊人网在线视频观看| 久久免费福利视频| 91人成网站色www免费| av网站免费线看| 色天使在线播放| 黄色片 720p| 午夜视频网站| 国产精品国产午夜免费福利看| 免费看一级片| 日本黄页网| 777丰满影院| 在线免费看视频| 性视频亚洲| 五月天亚洲| 美女污污网站| 一区二区精品| 狠狠干夜夜操| 美女扒开尿囗给男生桶爽| 性感美女毛片| 欧美日本一区二区三区道| 成人国产精品一级毛片视频| 欧美午夜性春猛交bbb| 亚洲婷婷综合中文字幕第一页| 午夜免费福利片| 精品国产成人系列| 视频在线观看高清免费看|