14、Hyperf 3 微服务系列 - Hyperf 3 服务熔断理论学习

作者: 温新

分类: 【Hyperf 3 微服务系列】

阅读: 1533

时间: 2023-05-29 15:48:12

hi,我是温新,一名 PHPer

Hyperf 3 微服务代码已上传至 Github:https://github.com/ziruchu/hyperf3-microservice-code

复杂的分布式系统中,服务之间往往存在着相关依赖的关系,一个服务出现问题可能会导致整个服务处于可用状态。

那么,为什么需要服务熔断,了解服务熔断之前先来了解下服务雪崩、服务降级。

服务雪崩

服务雪崩?没有听过。倒是听过缓存雪崩。那么服务雪崩是啥呢?

**服务雪崩,一个服务因某些不可用,从而导致所有与之关联的服务不可用,这种情况称为服务雪崩。**什么意思呢?来看下面的案例:

服务 A 需要到 服务 B服务 B 又需要用到 服务 C,他们之间形成了一个链路调用的形式 A-B-C,一旦 C 因为某些原因不可能,但后续的请求还是从 A 到 B 到 C,由于 C 已经不可用,请求都会阻塞在 B 服务中,慢慢积压的请求越来越多导致 B 可用,继续导致 A 不用。这种服务之间的不可用,就是服务雪崩。

有 2 种手段可以解决服务雪崩,分别是 服务熔断服务降级

服务熔断

什么是服务熔断

当下游服务器某些原因导致服务不用或请求变慢或失败时,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用,直接返回,快速释放资源。直到目标服务情况好转则恢复调用。

目前熔断器有,阿里出的 Sentinel,Netfilx 的 Hystrix 和 基于 Hystrix 实现的 Spring Cloud Hystrix。

熔断设计的模块

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

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

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

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

熔断器状态

1、初始状态,服务器无故障时,熔断器处于 closed 状态;

2、固定时间内(Hystrix 默认是 10 秒),接口调用出错比率达到一个阈值时( Hystrix 默认为 50%),会进入熔断open 开启状态。进行熔断状态后,后续调用该服务的请求不再经过网络,直接执行本地的 fallback 方法

3、在进入熔断开启状态一段时间之后(Hystrix 默认是 5 秒),熔断器会进入 half-open 半熔断状态。所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断开启状态。

4、在尝试一段时间后,服务还没有恢复,则进入本地的服务降级的逻辑处理。

怎么理解熔断器呢?把它看做是一个保险丝,

服务降级

服务降级一般是在服务器压力剧增的情况下,根据实际情况以及流量,对一些非核心服务进行有策略的延迟使用暂停使用,从而释放服务器资源,保证重要服务的可用。

简单地说,就是在高并发情况下,系统资源是有限的,非核心业务让道核心业务,优先保证核心业务的使用。

服务降级所考虑的问题:
  • 核心和非核心业务;
  • 是否支持降级,降级策略;
  • 业务放通的场景,策略。
降级分类
  • 按照是否自动化分为:自动开关降级和人工开关降级。

  • 按照功能分为:读服务降级、写服务降级。

  • 按照处于系统层次分为:多级降级。

降级策略
  • 限流降级;
  • 熔断降级;
  • 页面拒绝服务:页面提示由于服务繁忙此服务暂停;
  • 延迟持久化:页面访问照常,但是涉及记录变更,会提示稍晚能看到结果,将数据记录到异步队列或 log,服务恢复后执行。
降级与熔断之间的区别

触发原因不一样:服务熔断一般是某个服务故障引起;而服务降级一般是从整理负载情况考虑;

熔断可以理解成实现服务降级的一种手段:进入熔断后,后续对该服务的调用不再经过网络,直接执行本地默认方法,从而达到服务降级的效果。

怎么实现自动降级

**超时降级:**配置超时时间和重试次数,并使用异步探测机制探测恢复情况;

**失败次数降级:**对于不稳定的 API,当失败次数达到一定阈值时进行自动降级,需要使用异步探测恢复情况;

**故障降级:**若远程服务器不可用(网络故障、DNS 故障、HTTP 服务返回错误的状态码和 RPC 服务抛出异常),可以降级;

**限流降级:**触发限流机制时,可以使用暂时屏蔽的方式来进行短暂的屏蔽。

理解这些概念,对后续实现时才不会晕头转向,这是什么意思,那是什么意思。本篇文章只是进行简单的学习。详细的学习需要自己去琢磨了。

我是温新,本篇文章到此结束。

请登录后再评论