一些场景下,为了保障服务稳定性会引入熔断机制。本文介绍了用 Go 语言自己实现熔断需要什么操作。
成都创新互联公司自2013年创立以来,先为德清等服务建站,德清等地企业,进行企业商务咨询服务。为德清企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
熔断是指在下游发生错误时上游主动关闭或限制对下游的请求。
总得来说三个状态的转换大致如下图:
https://github.com/rubyist/circuitbreaker
CLOSE 允许
OPEN
HALFOPEN
atomic.StoreInt32((*int32)(&b.state), int32(HALFOPEN))
- type TripFunc func(Metricser) bool
- type Metricser interface {
- Fail() // records a failure
- Succeed() // records a success
- Timeout() // records a timeout
- Failures() int64 // return the number of failures
- Successes() int64 // return the number of successes
- Timeouts() int64 // return the number of timeouts
- ConseErrors() int64 // return the consecutive errors recently
- ErrorRate() float64 // rate = (timeouts + failures) / (timeouts + failures + successes)
- Samples() int64 // (timeouts + failures + successes)
- Counts() (successes, failures, timeouts int64)
- Reset()
- }
window 实现类
- type window struct {
- sync.RWMutex
- oldest int32 // oldest bucket index
- latest int32 // latest bucket index
- buckets []bucket // buckets this window holds
- bucketTime time.Duration // time each bucket holds
- bucketNums int32 // the numbe of buckets
- inWindow int32 // the number of buckets in the window
- allSuccess int64
- allFailure int64
- allTimeout int64
- conseErr int64
- }
- type bucket struct {
- failure int64
- success int64
- timeout int64
- }
用环形队列实现动态统计。把一个连续的时间切成多个小份,每一个 bucket 保存 BucketTime 的统计数据,BucketTime * BucketNums 是统计的时间区间。
每 BucketTime,会有一个 bucket 过期
- if w.inWindow == w.bucketNums {
- // the lastest covered the oldest(latest == oldest)
- oldBucket := &w.buckets[w.oldest]
- atomic.AddInt64(&w.allSuccess, -oldBucket.Successes())
- atomic.AddInt64(&w.allFailure, -oldBucket.Failures())
- atomic.AddInt64(&w.allTimeout, -oldBucket.Timeouts())
- w.oldest++
- if w.oldest >= w.bucketNums {
- w.oldest = 0
- }
- } else {
- w.inWindow++
- }
- w.latest++
- if w.latest >= w.bucketNums {
- w.latest = 0
- }
- (&w.buckets[w.latest]).Reset()
- type PanelStateChangeHandler func(key string, oldState, newState State, m Metricser)
名称栏目:Golang实现熔断机制
文章分享:http://www.mswzjz.cn/qtweb/news35/41335.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能