当前位置: 首页 > news >正文

怎么开发网站平台/seo推广公司

怎么开发网站平台,seo推广公司,建设网站如何索要素材,长沙百度关键词优化断路器背景 微服务连锁故障场景 在分布式环境中,各个微服务相互调用,当某些情况下,比如后端中间件服务故障、第三方服务中断导致某个服务无限期不可用,短时间无法恢复,则可能会导致连锁故障,最终影响压垮整…

断路器背景

微服务连锁故障场景

微服务的断路器实现图解Golang通用实现
在分布式环境中,各个微服务相互调用,当某些情况下,比如后端中间件服务故障、第三方服务中断导致某个服务无限期不可用,短时间无法恢复,则可能会导致连锁故障,最终影响压垮整个业务集群

断路器与重试

断路器模式不同于重试模式,重试模式是使应用程序可以重试操作以期望它会成功,而断路器模式是防止应用程序执行一个可能失败的操作,减少执行可能失败操作的CPU、内存、线程等资源的浪费,从而保证服务的整体可用

<!--more-->

断路器设计解析

基于代理模式的断路器

微服务的断路器实现图解Golang通用实现
断路器相当于一个请求操作执行的代理,托管请求操作的执行

实现原理流程:

  1. 拦截服务执行的请求,通过当前状态决定是否直接返回,如果否则执行后续操作
  2. 尝试执行操作,并获取返回结果
  3. 根据返回结果和当前统计信息,决定当前断路器的状态,修改状态
  4. 返回执行结果

断路器状态机

微服务的断路器实现图解Golang通用实现
断路器状态机实现上有三种状态:Closed(断路器关闭)、Open(开放)、HalfOpen(半开放)

状态说明备注
Closed关闭断路器关闭正常执行操作
Open打开断路器开放,所有请求直接返回错误,不执行任何请求
HalfOpen半开放允许有限数量的请求通过,如果执行成功,恢复到关闭状态,如果仍然失败,则恢复到开放,然后重新启动超时定时器

#断路器实现

实现原理图解

微服务的断路器实现图解Golang通用实现
断路器实现实现主要分为三部分:状态统计、状态转移、请求执行

状态统计:统计已经执行的请求的成功失败的数量,以确定是否需要进行状态转移
状态转移:根据当前统计信息和当前状态来进行目标状态的确定及转移操作
请求执行:代理前端任务的执行,如果当前状态不需要进行尝试执行,就直接返回错误,避免资源浪费

Golang里面已经有开源的实现,https://github.com/sony/gobreaker/blob/, 接下来救市剖析它的实现

状态统计-计数器Counts

Counts就是一个计数器,记录当前请求成功和失败的数量

type Counts struct {Requests             uint32    // 请求数TotalSuccesses       uint32    // 成功TotalFailures        uint32    // 失败ConsecutiveSuccesses uint32    // 连续成功ConsecutiveFailures  uint32 // 连续失败
}

计数器完成对应请求状态的次数,为后续状态转移提供数据, Counts提供了onRequest、onSuccess、onFailure、clear几个辅助接口用于实现对应请求状态的操作,感兴趣可以看下

状态机- CircuitBreaker

type CircuitBreaker struct {name          string// maxRequests限制half-open状态下最大的请求数,避免海量请求将在恢复过程中的服务再次失败maxRequests   uint32// interval用于在closed状态下,断路器多久清除一次Counts信息,如果设置为0则在closed状态下不会清除Countsinterval      time.Duration// timeout进入open状态下,多长时间切换到half-open状态,默认60stimeout       time.Duration// readyToTrip熔断条件,当执行失败后,会根据readyToTrip决定是否进入Open状态readyToTrip   func(counts Counts) bool// onStateChange断路器状态变更回调函数onStateChange func(name string, from State, to State)mutex      sync.Mutex//. state 断路器状态state      State// generation 是一个递增值,相当于当前断路器状态切换的次数, 为了避免状态切换后,未完成请求对新状态的统计的影响,如果发现一个请求的generation同当前的generation不同,则不会进行统计计数generation uint64//  Counts 统计counts     Counts// expiry 超时过期用于open状态到half-open状态的切换,当超时后,会从open状态切换到half-open状态expiry     time.Time
}

核心流程

CircuitBreaker.Execute

请求执行,对外开放的请求执行接口

func (cb *CircuitBreaker) Execute(req func() (interface{}, error)) (interface{}, error) {// 执行请求钩子,会根据当前状态,来返回当前的generation和err(如果位于open和half-open则不为nil), 通过err来进行判断是否直接返回generation, err := cb.beforeRequest()if err != nil {return nil, err}// 捕获panic,避免应用函数错误造成断路器panicdefer func() {e := recover()if e != nil {cb.afterRequest(generation, false)panic(e)}}()// 执行请求result, err := req()// 根据结果来进行对应状态的统计, 同时传递generationcb.afterRequest(generation, err == nil)return result, err
}

CircuitBreaker.beforeRequest

func (cb *CircuitBreaker) beforeRequest() (uint64, error) {cb.mutex.Lock()defer cb.mutex.Unlock()// 获取当前的状态now := time.Now()state, generation := cb.currentState(now)// open和half-open状态则直接返回if state == StateOpen {return generation, ErrOpenState} else if state == StateHalfOpen && cb.counts.Requests >= cb.maxRequests {// 避免海量请求对处于恢复服务的影响,这里有一个限流的操作,避免请求数超过最大请求数return generation, ErrTooManyRequests}// 统计状态cb.counts.onRequest()return generation, nil
}

CircuitBreaker.afterRequest

func (cb *CircuitBreaker) afterRequest(before uint64, success bool) {cb.mutex.Lock()defer cb.mutex.Unlock()// 重新获取状态now := time.Now()state, generation := cb.currentState(now)// 如果前后状态不一致,则不计数if generation != before {return}// 根据状态计数if success {cb.onSuccess(state, now)} else {cb.onFailure(state, now)}
}

CircuitBreaker.currentState

func (cb *CircuitBreaker) currentState(now time.Time) (State, uint64) {switch cb.state {case StateClosed:// 如果当前当前是closed状态,并且有设置expiry,则递增Generation到新一轮统计计数if !cb.expiry.IsZero() && cb.expiry.Before(now) {cb.toNewGeneration(now)}case StateOpen:// 如果是Open状态,并且超时,则尝试到半打开状态if cb.expiry.Before(now) {cb.setState(StateHalfOpen, now)}}return cb.state, cb.generation
}

CircuitBreaker.toNewgeneration


func (cb *CircuitBreaker) toNewGeneration(now time.Time) {// 递增generation, 清除状态cb.generation++cb.counts.clear()// 设置超时时间var zero time.Timeswitch cb.state {case StateClosed:if cb.interval == 0 {cb.expiry = zero} else {cb.expiry = now.Add(cb.interval)}case StateOpen:cb.expiry = now.Add(cb.timeout)default: // StateHalfOpencb.expiry = zero}
}

总结

断路器黄金链路

微服务的断路器实现图解Golang通用实现

  • beforeRequest :完成当前请求是否可以执行请求,状态超时切换,同时返回当前的genenration
  • req: 执行请求
  • afterRequest: 完成请求状态统计,决定状态切换

断路器的优缺点

断路器比较适合针对远程服务或者第三方服务的调用,如果该操作极有可能会失败,则断路器可以尽可能的减小失败对应用的影响,避免资源浪费

但缺点也显而易见,断路器本身相当于一层代理,在应用程序执行进行统计和控制,本身就有一定的资源消耗,同时内部基于synx.Mutex锁来实现,高并发下肯定会有锁争用问题,可能需要根据业务来使用多个断路器,来分散这种锁争用,同时应该避免在断路器req函数内,去执行重试和过长时间的超时等待,因为断路器核心是快速失败

更多文章可以访问http://www.sreguide.com/

转载于:https://blog.51cto.com/14324123/2394675

http://www.jmfq.cn/news/4995037.html

相关文章:

  • 跨境电商网站开发文档/提高工作效率的重要性
  • 做网站原型图/网站推广的软件
  • 网站临时会话/小程序开发一个多少钱啊
  • 别人帮做的网站到期续费/seo查询爱站网
  • wordpress仪表盘/seo交互论坛
  • 企业介绍ppt案例欣赏/昭通网站seo
  • 在360怎么做网站/北京seo服务行者
  • 如何在电商网站做市场调研/关键词首页排名优化
  • 网站建设的电话销售/接广告推广
  • idea建设完整的网站/如何规划企业网络推广方案
  • 哪些网站专做新闻/开鲁网站seo站长工具
  • 常见网站结构有哪些/google谷歌搜索主页
  • 每天网站外链做几条最好/2023新闻摘抄十条
  • 企业推广费用占比多少合适/网络营销seo培训
  • 广州公司网站设计/百度一下打开
  • 网站怎么做才是对搜索引擎友好/厦门人才网597人才网
  • 郑州做网站zztuotian/如何自己创建一个网站
  • 企业模板网站建设/搭建一个app平台要多少钱
  • 做阿里国际网站多少钱/最近三天的新闻大事
  • 怎样用jsp做网站/中国国家人事人才培训网证书查询
  • ui自学网站/高端营销型网站建设
  • 广州网站app制作公司/seo发包技术教程
  • 海外直邮购物网站/外贸网站推广
  • 怎样做网站地图/2022百度指数排名
  • 做博客网站如何盈利/美食软文300范例
  • 还有做网站的必要吗/建站公司最新报价
  • wordpress多站点 文章/龙斗seo博客
  • 有没有专门做外贸的网站/深圳网站搜索优化工具
  • html网站模版/站长统计官网
  • 网站的建设运营收费是哪些/百度科技有限公司