日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

馬哥Linux運(yùn)維 ? 來(lái)源: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ù)對(duì)自身訪問的依賴,防止出現(xiàn)雪崩效應(yīng);另一方面降低請(qǐng)求頻率以方便上游盡快恢復(fù)服務(wù)。

熔斷器的應(yīng)用也非常廣泛。除了在我們應(yīng)用中,為了請(qǐ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),部分請(qǐng)求限流訪問

四種狀態(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)。

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

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

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

熔斷器的定義

typeCircuitBreakerstruct{
namestring
maxRequestsuint32//最大請(qǐng)求數(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:最大請(qǐng)求數(shù)。當(dāng)在最大請(qǐng)求數(shù)下,均請(qǐng)求正常的情況下,會(huì)關(guān)閉熔斷器

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

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

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

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

請(qǐng)求的執(zhí)行

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

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

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

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

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

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

請(qǐng)求之前的判定操作

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

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),并且請(qǐng)求次數(shù)過多了,則直接返回
returngeneration,ErrTooManyRequests
}

cb.counts.onRequest()
returngeneration,nil
}

其中當(dāng)前狀態(tài)的計(jì)算,是依據(jù)當(dāng)前狀態(tài)來(lá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
}

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

請(qǐng)求之后的處理操作

每次請(qǐng)求之后,會(huì)通過請(qǐng)求結(jié)果是否成功,對(duì)熔斷器做計(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)下:

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

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

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

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

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

總結(jié)

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

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

  • 在半開狀態(tài)下,可能出現(xiàn)請(qǐng)求過多的情況。這是由于半開狀態(tài)下,連續(xù)請(qǐng)求成功的數(shù)量未達(dá)到最大請(qǐng)求值。所以,熔斷器對(duì)于請(qǐng)求時(shí)間過長(zhǎng)(但是比較頻繁)的服務(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)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7349

    瀏覽量

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

    關(guān)注

    6

    文章

    532

    瀏覽量

    33652
  • go語(yǔ)言
    +關(guān)注

    關(guān)注

    1

    文章

    161

    瀏覽量

    9853

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    南熔工程師帶你:如何選擇熔斷器(第一期)

    選擇熔斷器是一個(gè)需要嚴(yán)謹(jǐn)對(duì)待的技術(shù)工作。當(dāng)不確定時(shí),尤其是涉及高電壓、大電流、關(guān)鍵設(shè)備或安全重要系統(tǒng)時(shí), 務(wù)必尋求專業(yè)電氣工程師或熔斷器供應(yīng)商的建議。 選擇熔斷器時(shí),需要綜合考慮電路參數(shù)、應(yīng)用環(huán)境
    的頭像 發(fā)表于 04-30 08:27 ?281次閱讀
    南熔工程師帶你:如何選擇<b class='flag-5'>熔斷器</b>(第一期)

    保險(xiǎn)絲與熔斷器有什么區(qū)別

    ; ④不能實(shí)現(xiàn)遙控,需要與電動(dòng)刀開關(guān)、開關(guān)組合才有可能。 根據(jù)保險(xiǎn)絲與熔斷器的區(qū)別,再結(jié)合電路工作的具體情況,選擇合適的產(chǎn)品型號(hào)做電路過載保護(hù),才能保證電路在過載時(shí)不損壞,提高產(chǎn)品的使用壽命。
    發(fā)表于 04-03 07:10

    如何選用熔斷器保護(hù)電機(jī)

    在工業(yè)生產(chǎn)和日常生活中,電機(jī)作為動(dòng)力源被廣泛應(yīng)用,而熔斷器作為保護(hù)電機(jī)的重要元件,其正確選用直接關(guān)系到電機(jī)的安全運(yùn)行和設(shè)備的使用壽命。本文將詳細(xì)介紹如何選用熔斷器來(lái)保護(hù)電機(jī),包括熔斷器的類型、選型原則、安裝注意事項(xiàng)以及常見問題的
    的頭像 發(fā)表于 03-12 17:14 ?1097次閱讀
    如何選用<b class='flag-5'>熔斷器</b>保護(hù)電機(jī)

    熔斷器概念、工作原理以及選擇與應(yīng)用

    熔斷器,又稱為保險(xiǎn)絲或熔斷體,是一種專門設(shè)計(jì)用于保護(hù)電路免受過載或短路損害的電氣元件。它通過在電流超過預(yù)定閾值時(shí),利用自身產(chǎn)生的熱量熔斷,從而切斷電路,防止事故進(jìn)一步擴(kuò)大。根據(jù)結(jié)構(gòu)和應(yīng)用的不同,
    的頭像 發(fā)表于 01-05 09:11 ?1161次閱讀

    POWrFuse? PF - E系列光伏熔斷器:設(shè)計(jì)與應(yīng)用解析

    POWrFuse? PF - E系列光伏熔斷器:設(shè)計(jì)與應(yīng)用解析 在光伏系統(tǒng)的設(shè)計(jì)中,熔斷器是保障系統(tǒng)安全穩(wěn)定運(yùn)行的關(guān)鍵組件之一。今天我們就來(lái)詳細(xì)探討一下BOURNS公司的POWrFuse? PF
    的頭像 發(fā)表于 12-23 17:55 ?919次閱讀

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

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

    482系列告警指示熔斷器座:電信與控制面板電路的理想之選

    482系列告警指示熔斷器座:電信與控制面板電路的理想之選 在電子電路設(shè)計(jì)中,熔斷器座是保障電路安全運(yùn)行的重要部件。今天,我們就來(lái)詳細(xì)了解一下Littelfuse的482系列告警指示熔斷器座,看看它有
    的頭像 發(fā)表于 12-16 14:25 ?488次閱讀

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

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

    30EV系列高壓熔斷器:電動(dòng)汽車電路保護(hù)的可靠選擇

    30EV系列高壓熔斷器:電動(dòng)汽車電路保護(hù)的可靠選擇 在電動(dòng)汽車和混合動(dòng)力汽車的高壓、大電流系統(tǒng)中,電路保護(hù)至關(guān)重要。30EV系列高壓熔斷器以其獨(dú)特的技術(shù)和出色的性能,成為了這些系統(tǒng)中過流保護(hù)的理想
    的頭像 發(fā)表于 12-15 17:05 ?616次閱讀

    POWR - SPEED? Fuse L60QS系列高速圓柱形半導(dǎo)體熔斷器詳解

    POWR - SPEED? Fuse L60QS系列高速圓柱形半導(dǎo)體熔斷器詳解 在電子設(shè)備的設(shè)計(jì)中,熔斷器是保障電路安全的重要元件。今天要給大家介紹的是Littelfuse公司的POWR
    的頭像 發(fā)表于 12-15 16:30 ?571次閱讀

    520系列5×20mm熔斷器座評(píng)測(cè):設(shè)計(jì)、性能與應(yīng)用全解析

    520系列5×20mm熔斷器座評(píng)測(cè):設(shè)計(jì)、性能與應(yīng)用全解析 在電子電路設(shè)計(jì)中,熔斷器座是保障電路安全的關(guān)鍵組件之一。今天我們要詳細(xì)評(píng)測(cè)的是Littelfuse公司的520系列Metric OMNI
    的頭像 發(fā)表于 12-15 16:25 ?574次閱讀

    熔斷器柜局放監(jiān)測(cè)終端

    文章由山東華科信息技術(shù)有限公司提供在電力系統(tǒng)中,熔斷器柜作為過電流保護(hù)的核心設(shè)備,承擔(dān)著切斷故障電流、保障電網(wǎng)安全運(yùn)行的重要使命。然而,其內(nèi)部絕緣材料的老化、接觸不良或金屬微粒等缺陷,可能引發(fā)局部
    的頭像 發(fā)表于 12-03 09:31 ?545次閱讀
    <b class='flag-5'>熔斷器</b>柜局放監(jiān)測(cè)終端

    威可特熔斷器 VGT 延時(shí)型 Class G 通用熔斷器

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

    基于IEC60127-7標(biāo)準(zhǔn)儲(chǔ)能系統(tǒng)的保護(hù)熔斷器選型指南

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

    基于IEC60127-7標(biāo)準(zhǔn)儲(chǔ)能系統(tǒng)保護(hù)熔斷器選型

    引言:IEC在2021年12月發(fā)布了電池及電池系統(tǒng)保護(hù)熔斷器標(biāo)準(zhǔn)IEC60127-7(Ed1.0), 其中包括: 1)熔斷器額定電壓達(dá)到了1500VDC及以上 2)熔斷器的額定電流達(dá)到了5000A
    的頭像 發(fā)表于 07-07 15:24 ?1915次閱讀
    基于IEC60127-7標(biāo)準(zhǔn)儲(chǔ)能系統(tǒng)保護(hù)<b class='flag-5'>熔斷器</b>選型
    徐州市| 丹棱县| 长寿区| 农安县| 玉屏| 安达市| 信丰县| 陈巴尔虎旗| 东方市| 白水县| 阳信县| 府谷县| 大丰市| 凤翔县| 西丰县| 眉山市| 习水县| 甘肃省| 阿坝| 信丰县| 商河县| 临武县| 辛集市| 长海县| 南皮县| 库车县| 东兰县| 武冈市| 安阳县| 敦化市| 响水县| 通渭县| 望城县| 赣州市| 泰来县| 安宁市| 廊坊市| 烟台市| 玛多县| 宽城| 青阳县|