成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 實現熔斷機制

開發 后端
一些場景下,為了保障服務穩定性會引入熔斷機制。本文介紹了用 Go 語言自己實現熔斷需要什么操作。

 一些場景下,為了保障服務穩定性會引入熔斷機制。本文介紹了用 Go 語言自己實現熔斷需要什么操作。

什么是熔斷?

熔斷是指在下游發生錯誤時上游主動關閉或限制對下游的請求。

原理

  1.  通常熔斷器分為三個時期:CLOSED,OPEN,HALFOPEN
  2.  RPC 正常時,為 CLOSED;
  3.  當 RPC 錯誤增多時,熔斷器會被觸發,進入 OPEN;
  4.  OPEN 后經過一定的冷卻時間,熔斷器變為 HALFOPEN;
  5.  HALFOPEN 時會對下游進行一些有策略的訪問,然后根據結果決定是變為 CLOSED,還是 OPEN;

總得來說三個狀態的轉換大致如下圖:

Go 實現

https://github.com/rubyist/circuitbreaker

IsAllowed 是否允許請求,根據當前狀態判斷

CLOSE 允許

OPEN

  •  在 CoolingTimeout 冷卻時間內,不允許
  •  過了冷卻時間,狀態變為 HALFOPEN,允許訪問

HALFOPEN

  •  在 DetectTimeout 檢測時間內,允許訪問
  •  否則不允許

atomic.StoreInt32((*int32)(&b.state), int32(HALFOPEN))

trip 判斷是否達到熔斷限額(可以自定義)

  1. type TripFunc func(Metricser) bool 
  •  ThresholdTripFunc 錯誤閾值
  •  ConsecutiveTripFunc 連續錯誤超過閾值
  •  RateTripFunc 根據最少訪問數和錯誤率判斷

Metricser 訪問統計,包括成功數、失敗數、超時數、錯誤率、采樣數、連續錯誤數 

  1. type Metricser interface {  
  2.    Fail()    // records a failure  
  3.    Succeed() // records a success  
  4.    Timeout() // records a timeout  
  5.    Failures() int64    // return the number of failures  
  6.    Successes() int64   // return the number of successes  
  7.    Timeouts() int64    // return the number of timeouts  
  8.    ConseErrors() int64 // return the consecutive errors recently  
  9.    ErrorRate() float64 // rate = (timeouts + failures) / (timeouts + failures + successes)  
  10.    Samples() int64     // (timeouts + failures + successes)  
  11.    Counts() (successes, failures, timeouts int64)  
  12.    Reset()  

window 實現類 

  1. type window struct {  
  2.    sync.RWMutex  
  3.    oldest  int32     // oldest bucket index  
  4.    latest  int32     // latest bucket index  
  5.    buckets []bucket // buckets this window holds  
  6.    bucketTime time.Duration // time each bucket holds  
  7.    bucketNums int32         // the numbe of buckets  
  8.    inWindow   int32         // the number of buckets in the window  
  9.    allSuccess int64  
  10.    allFailure int64  
  11.    allTimeout int64  
  12.    conseErr int64  
  13.  
  14. type bucket struct {  
  15.    failure int64  
  16.    success int64  
  17.    timeout int64  

用環形隊列實現動態統計。把一個連續的時間切成多個小份,每一個 bucket 保存 BucketTime 的統計數據,BucketTime * BucketNums 是統計的時間區間。

每 BucketTime,會有一個 bucket 過期 

  1. if w.inWindow == w.bucketNums {  
  2.    // the lastest covered the oldest(latest == oldest)  
  3.    oldBucket := &w.buckets[w.oldest]  
  4.    atomic.AddInt64(&w.allSuccess, -oldBucket.Successes())  
  5.    atomic.AddInt64(&w.allFailure, -oldBucket.Failures())  
  6.    atomic.AddInt64(&w.allTimeout, -oldBucket.Timeouts())  
  7.    w.oldest++  
  8.    if w.oldest >= w.bucketNums {  
  9.       w.oldest = 0  
  10.    }  
  11. } else {  
  12.    w.inWindow++  
  13.  
  14. w.latest++ 
  15. if w.latest >= w.bucketNums {  
  16.    w.latest = 0  
  17.  
  18. (&w.buckets[w.latest]).Reset() 

Panel Metricser 的容器

PanelStateChangeHandler 熔斷事件 

  1. type PanelStateChangeHandler func(key string, oldState, newState State, m Metricser) 

缺陷

  1.  所有 breaker 公用同一個 BucketTime,統計周期不支持更新
  2.  冷卻時間不支持動態更新 

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2021-11-25 09:55:47

Golang熔斷器語言

2021-07-22 09:43:09

Golang語言并發機制

2021-02-22 11:30:07

Golang 1.16ModuleGolang

2020-09-26 10:56:33

服務器熔斷服務隔離

2022-07-05 09:44:25

服務治理熔斷限流

2022-08-08 08:31:00

Linux內存管理

2022-12-28 08:08:57

2025-02-27 08:00:00

熔斷機制微服務Spring

2025-02-27 09:35:22

2022-05-17 12:23:25

排序算法面試

2022-08-26 10:24:48

架構Golang

2025-04-09 11:15:00

服務熔斷服務降分布式系統

2025-05-28 01:15:00

Golang重試機制

2024-10-09 17:19:04

GoGolangKubernetes

2023-01-26 00:59:39

B-Treegolang度量衡

2024-11-12 08:00:00

LSM樹GolangMemTable

2023-07-03 07:40:13

VueGolangweb

2022-01-17 10:55:50

微服務API網關

2022-11-16 17:16:41

spring限流

2020-07-28 08:32:57

微服務API網關熔斷
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品99999 | 九九热最新地址 | a级免费黄色片 | 狠狠色狠狠色综合系列 | 国产一区二区三区视频在线观看 | 99re视频这里只有精品 | 国产亚洲一区二区三区 | 韩国精品在线 | 四虎永久影院 | 色婷婷精品国产一区二区三区 | 日韩午夜网站 | 91在线电影 | 久久激情视频 | 精品视频在线免费观看 | 狠狠婷婷综合久久久久久妖精 | 国产中的精品av涩差av | 992tv人人草 久久精品超碰 | www.亚洲视频| 波多野结衣中文字幕一区二区三区 | 99草免费视频 | 欧美日韩精品亚洲 | 盗摄精品av一区二区三区 | 久久综合激情 | 国产欧美精品区一区二区三区 | 欧美日韩亚洲视频 | 亚洲一区二区中文字幕 | 国产精品视频一 | 亚洲在线免费观看 | 九九热国产精品视频 | 九九热视频这里只有精品 | 中文字幕一级毛片 | 国内精品视频在线 | 一级黄色播放 | 中文字幕第7页 | 天天看天天摸天天操 | 久久久久久亚洲精品 | 日韩精品一区二区久久 | 国产成人久久av免费高清密臂 | 国产免费一区 | 精品丝袜在线 | 日韩在线小视频 |