Sentinel 服务熔断

开课吧樵夫2022-01-04 18:10

  在日常开发过程中除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。

  一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。

  现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

  熔断的相关概念

  服务熔断是为了在外部环境不通畅场景下,不至于将系统拖垮,也就是为了防止服务雪崩的发生。为了防止服务雪崩的发生,在发现了对某些资源请求的响应缓慢或调用异常较多时,直接将对这些资源的请求掐断一段时间。而在这段时间内的请求将不再等待超时,而是直接返回事先设定好的降级结果。这些请求将不占用系统资源,从而避免了服务雪崩的发生。这就是服务熔断。

  服务雪崩是指在一些比较复杂的系统会出现A依赖B,B依赖C,C依赖D的情况,产生很长的调用链路,这种复杂的调用链路被称为1->N的扇出。如果在调用链路上,有一个或者几个被调用的服务出现问题(不可用、延迟过高等问题)会导致调用A服务的请求被堵住。这时A服务仍然会占用系统线程、IO等资源,如果A服务请求继续增加,系统出现瓶颈导致其他请求不可用,最终业务系统崩溃,这就是雪崩效应。

Sentinel 服务熔断

Sentinel 服务熔断

  从动图可以看到,用户请求需要访问A、P、H、I服务。如果资源I出现了问题,用户请求就会发生等待(网络带宽被占用)。如果资源I在短时间内访问数量很大,将会有大量的网络带宽、消费者线程被占用。这种发生在分布式SOA系统中的雪崩效应被称为服务雪崩。

  动态设置熔断规则

  通过Sentinel的Dashboard的控制台,设置慢调用比例的熔断规则。如果请求的时间超过200ms,直接将服务熔断对于服务熔断规则,一般是提前设置好的。可以通过Sentinel Dashboard进行动态设置。

  复制consumer-nacos-sentinel-degrade工程,重命名为consumer-nacos-sentinel-circuitbreaking。

  修改处理器