服务降级 和 服务熔断 (纯概念说明)

一、服务降级(从整体考虑,保证核心服务运行)

1.1、概念:

当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

1.2、方案:

  1. 服务接口拒绝服务:页面能访问,但是添加删除提示服务器繁忙。页面内容也可在 Varnish 或 CDN 内获取。
  2. 页面拒绝服务:页面提示由于服务繁忙此服务暂停。跳转到 varnish 或 nginx 的一个静态页面。
  3. 延迟持久化:页面访问照常,但是涉及记录变更,会提示稍晚能看到结果,将数据记录到 异步队列 或 log ,服务恢复后执行。
  4. 随机拒绝服务:服务 接口随机 拒绝服务,让用户重试,目前较少有人采用。因为用户体验不佳。

二、服务熔断 (异常超时,快速响应)

2.1、概念

如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

2.2、熔断设计

三个模块: 熔断请求判断算法、熔断恢复机制、熔断报警

  • (1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。

  • (2)熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。

  • (3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警

三、服务降级 与 服务熔断 的区别

降级:

举个例子解释,我们去银行排队办理业务,大部分的银行分为普通窗口、特殊窗口(VIP窗口,老年窗口)。某一天银行大厅排 普通窗口 的人巨多。这时 特殊窗口 贴出告示说某时刻之后再开放。那么这时特殊窗口的工作人员就可以空出来去帮其他窗口办理业务,提高办事效率,已达到 解决普通窗口排队的人过的目的。这时即为降级,降级的目的是为了解决整体项目的压力,而牺牲掉某一服务模块而采取的措施。

熔断:

举个例子解释,生活中每家每户都在用电,小明家的电线因为故障导致了小明家停电了。而小李、小张家的电是正常使用的。电力公司没有因为小明家有故障线路而停掉其他人家的电,同时小明家没有使用有故障的电路的电。这时即为熔断。熔断的目的是当A服务模块中的某块程序出现故障后为了不影响其他客户端的请求而做出的及时回应。

以上为了加深理解分别举了个例子。有不妥的地方欢迎留言指出。下面摘录一段网友的总结:

相同点:

  1. 目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段;
  2. 最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
  3. 粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改);
  4. 自治性要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,开关预置、配置中心都是必要手段 ;

区别:

触发原因不太一样, 服务降级一般是从整体负荷考虑,而服务熔断一般是某个服务(下游服务)故障引起 ;
管理目标的层次不太一样, 降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始);熔断 其实是一个框架级的处理,每个微服务都需要(无层级之分),


服务降级:
一般是从整体负荷考虑,就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回掉,返回一个缺省值,这样做,虽然服务水平下降,但好歹,比直接挂掉要强。

服务熔断:
一般是某个服务故障或者是异常引起的,类似现实世界中的‘保险丝’,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。

服务降级处理 是在客户端实现完成的,与服务端没有关系。

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/88373447