聊聊Sentinel的熔断降级

聊聊,sentinel,熔断,降级 · 浏览次数 : 44

小编点评

## Sentinel熔断降级实现分析 Sentinel 的熔断降级采用两种模式: **1. 基于熔断规则的简单处理** * 当两个服务启动并运行时,断路器默认关闭。 * 统计远程 API 调用的次数。 * 如果调用失败超过阈值,断路器变为 OPEN 状态,流量中断。 **2. 基于断路器模式** * 采用 3 个主要状态:CLOSED、OPEN 和 HALF OPEN。 * CLOSED State:正在交互的两个服务都启动并运行时,断路器默认关闭。 * OPEN State:远程 API 调用失败时,断路器变为 OPEN 状态,流量中断。 * HALF OPEN State:在 OPEN 状态停留给定的超时时间后,自动将其状态变为 HALF OPEN 状态。 **关键对象** * **ProcessorSlot:** 处理器槽,用于实现责任链模式,基于 SPI 机制支持可扩展性。 * **Rule (规则):** 定义熔断降级的规则,包括失败率、超时时间等参数。 * **指标数据统计 (Bucket):** 用于统计指标数据的容器,可以记录 1 秒或 10 毫秒内的数据。 **实现流程** 1. 收到请求时,根据请求时间计算出索引值。 2. 从滑动窗口中获取 WindowWrap 类,并调用其 add 方法统计指标。 3. 如果指标数据统计超出了阈值,断路器变为 OPEN 状态,流量中断。 4. 如果指标数据统计完,断路器变为 HALF OPEN 状态,允许有限数量的 API 调用通过。 5. 如果失败调用计数大于此有限数量,则断路器再次变为 OPEN 状态,流量继续中断。 6. 否则关闭断路器,流量恢复正常。 **其他** * 指标数据统计是 Sentinel 中一个重要的组成部分,用于统计 1 秒或 10 毫秒内的 API 调用数量、成功率、异常率等信息。 * 不同的指标数据统计算法可以根据需要选择,例如基于滑动窗口的算法可以提供更细化的指标数据。

正文

Sentinel的熔断降级实现有两个模式,一开始是基于熔断规则的简单处理(说简单其实不简单),目前已改为了基于断路器模式实现,这也是业内常见实现。

断路器模式

断路器模式中讨论了 3 个主要状态。他们是:

CLOSED
OPEN
HALF OPEN
让我们简要了解一下状态……

CLOSED State
当正在交互的两个服务都启动并运行时,断路器默认关闭。断路器会持续统计远程 API 调用的次数。

OPEN State
一旦远程 API 调用失败百分比超过给定阈值,断路器就会将其状态更改为 OPEN 状态。调用微服务会立即失败,返回异常。也就是说,流量中断了。

HALF OPEN State
在 OPEN 状态停留给定的超时时间后,断路器自动将其状态变为 HALF OPEN 状态。在这种状态下,只允许有限数量的远程 API 调用通过。如果失败调用计数大于此有限数量,则断路器再次变为 OPEN 状态,流量继续中断。否则关闭断路器,流量恢复正常。

流程图可描述如下:
image

实现

最经典的实现就是Hytrix,而且它的实现是基于响应式编程来做的;其次Spring官方出品的Resilience4j、Sentinel也是基于此方式实现。

Sentinel熔断降级实现关键对象

我个人对Sentinel比较推崇,功能强大,源码易读,而且设计架构简介。Sentinel框架中有三个关键的对象是一直贯彻整个框架的,也是最关键的三个个点:ProcessorSlot、Rule(规则)与指标数据统计(Bucket)。

ProcessorSlot

这里不多讲,实现了责任链模式,基于SPI机制支持可扩展性,这个设计很好,值得借鉴。其实也类似MVC框架的管道模式。DegradeSlot插槽实现断路器模式,最终达到限流降级的目的。

规则与指标数据统计

对于熔断降级或是限流等场景,最后的实现结果一定是由于当前的流量或是异常等维度指标超出了限定值,这个过程就是规则(Rule)的体现,而规则背后的开关实现就是指标数据的统计。这是我个人的理解,大白话表述。

指标数据统计在Sentinel中对应着三个抽象;暂时先不表述。如果要我来实现的话,我的思考是,有一个数据结构存储着在某个时间段内,统计了某些维度的数据(比如成功、异常、总计),而且这个数据结构是随着时间的推移不断地统计;现在给定一个时间点或是时间段,判断是否需要限流或是熔断;在这里就需要注意两个问题点:

  1. 给定的时间是否在统计的时间范围内
  2. 在统计的时间范围内,如果定位到对应的数据结构
指标统计抽象

Sentinel是基于滑动窗口实现资源的实时指标数据统计的。

Sentinel使用Bucket统计一段时间内的各项指标数据,这些指标数据包括请求总数、成功总数、异常总数、总耗时、最小耗时等。一个Bucket可以记录1秒内的数据,也可以记录10毫秒内的数据,这由采样周期决定。采样周期就是每个Bucket的时间窗口大小。

WindowWrap,用于记录Bucket的时间窗口信息(包括时间窗口的开始时间戳和大小),而WindowWrap数组就是一个滑动窗口。当收到一个请求时,可以根据收到请求时的时间戳和滑动窗口大小计算出一个索引值,从滑动窗口(WindowWrap数组)中获取一个WindowWrap类,从而获取WindowWrap类包装的Bucket,并调用Bucket实例的add方法统计指标。

LeapArray,Sentinel 中统计指标的基本数据结构。基于滑动窗口算法来计算数据返回windowWrap时间窗口对象。前面说的两个问题在这个数据结构里面都有对应的算法实现,当然还有别的统计算法,但最后都是算时间窗口。

脑图概览

image

与聊聊Sentinel的熔断降级相似的内容:

聊聊Sentinel的熔断降级

Sentinel的熔断降级实现有两个模式,一开始是基于熔断规则的简单处理(说简单其实不简单),目前已改为了基于断路器模式实现,这也是业内常见实现。 断路器模式 断路器模式中讨论了 3 个主要状态。他们是: CLOSED OPEN HALF OPEN 让我们简要了解一下状态…… CLOSED Stat

聊聊Spring Cloud Alibaba Sentinel的限流

Spring Cloud Alibaba Sentinel限流功能概览,目前先整理一版,东西有点多,想慢慢打开;后续继续更新......

聊聊GLM-4-9B开源模型的微调loss计算

概述 Github官方地址:GLM-4 网上已经有很多关于微调的文章,介绍各种方式下的使用,这里不会赘述。我个人比较关心的是微调时的loss计算逻辑,这点在很多的文章都不会有相关的描述,因为大多数人都是关心如何使用之类的应用层,而不是其具体的底层逻辑,当然咱也说不清太底层的计算。 可了解其它loss

聊聊一个差点被放弃的项目以及近期的开源计划

前言 自从 StarBlog 和 SiteDirectory 之后,我还没写新的关于开源项目的系列,最近又积累了很多想法,正好写一篇博客来总结一下。 关于差点被放弃的项目,就是最近一直在做的单点认证(IdentityServerLite) IdentityServerLite 开发这个项目的起因,是

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。 今天就来简单入门一下 JWT。 官方介绍:https://jwt.io/introduction

聊聊MySQL是如何处理排序的

在MySQL的查询中常常会用到 order by 和 group by 这两个关键字,它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢?

聊聊 Linux iowait

哈喽大家好,我是咸鱼。 我们在使用 top 命令来查看 Linux 系统整体 CPU 使用情况的时候,往往看的是下面这一列: %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 68.0 wa, 0.0 hi, 0.0 si, 0.0 st 其中,man 手册解释 w

聊聊Mybatis框架原理

好久没有写博客了。最近工作中封装了一个类似ORM框架的东西。大概的原理就是将Excel数据初始化到本地sqlite数据库后,通过json配置文件,对数据库的数据做增删改查等操作。 其实大概的思考了下,就是半ORM框架mybatis的逻辑,只是我们自己封装的简陋蛮多。想想有现成的轮子没用,反而是自己写

聊聊Spring的工厂方法与FactoryBean

概述 工厂方法是比较常见,常用的一种设计模式。FactoryBean是Spring提供的一种Bean注入IOC容器的方式。 工厂方法 在做日常开发时,一般都会避免直接new对象,而且将new的操作丢给IOC容器,但对于第三方系统的集成,我们不太好直接丢给IOC容器,此时可以通过工厂模式, 提供一个工

聊聊Spring Cloud Alibaba解决方案组件

在java的微服务解决方案中,最先出现目前应用比较多的就是spring cloud netfix系列,但是随着阿里的强劲支持,spring cloud alibaba解决方案逐渐可以替代前者,当然dubbo也是不容小觑的。之前面试几家公司应用的都是spring cloud alibaba,随着我自己