CircuitBreaker断路器-Resilience4j

在这里插入图片描述

目录

  • 背景
    • 分布式架构面临的问题:服务雪崩
    • 如何解决?
  • CircuitBreaker
  • Resilience4j
    • CircuitBreaker 服务熔断+服务降级
      • 三种状态转换例子
      • 参数配置
      • 案例demo作业
    • BulkHead隔离
      • 特性
        • SemaphoreBulkhead使用了信号量
        • FixedThreadPoolBulkhead使用了有界队列和固定大小线程池
    • 限流
      • 常见限流算法
      • 参数配置
  • 相关文献

背景

分布式架构面临的问题:服务雪崩

多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的"扇出"。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。

对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。

比较经典的就是23年10.23号各大厂的生产故障:语雀、阿里云产品控制台、阿里系大部分产品(淘宝、咸鱼、阿里云盘)崩溃。

如何解决?

出现有问题的节点,快速熔断(快速返回失败处理或者返回默认兜底数据【服务降级】)。

"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

相对应的措施就是:

  • 服务熔断:类比保险丝,保险丝闭合状态(CLOSE)可以正常使用,当达到最大服务访问后,直接拒绝访问跳闸限电(PEN),此刻调用方会接受服务降级的处理并返回友好提示
  • 服务降级:服务器忙,请稍后再试。不让客户端等待并立刻返回一个友好提示,fallback
  • 服务限流:秒杀高并发操作,限制速率
  • 服务限时
  • 服务预热:一开始放20、30个,后面慢慢增加量100个等等
  • 接近实时的监控

以上功能现在市面上可用的是Hystrix,但Hystrix已经停止更新进入维护状态,官方给出最好替代是Resilience4j。

所以推荐使用Resilience4j!

CircuitBreaker

CircuitBreaker的目的是保护分布式系统免受故障和异常,提高系统的可用性和健壮性。

当一个组件或服务出现故障时,CircuitBreaker会迅速切换到开放OPEN状态(保险丝跳闸断电),阻止请求发送到该组件或服务从而避免更多的请求发送到该组件或服务。这可以减少对该组件或服务的负载,防止该组件或服务进一步崩溃,并使整个系统能够继续正常运行。同时,CircuitBreaker还可以提高系统的可用性和健壮性,因为它可以在分布式系统的各个组件之间自动切换,从而避免单点故障的问题。

Circuit Breaker只是一套规范和接口,落地实现者是Resilience4J。
在这里插入图片描述

Resilience4j

Resilience4j 是一个专为函数式编程而设计的轻量级容错库。Resilience4j 提供高阶函数(装饰器),以增强任何功能接口、lambda 表达式或方法引用,包括断路器、速率限制器、重试或隔板。您可以在任何函数接口、lambda 表达式或方法引用上堆叠多个装饰器。优点是您可以选择所需的装饰器,而没有别的。
Resilience4j 2 需要 Java 17。

核心功能

  • resilience4j-circuitbreaker:熔断
  • resilience4j-ratelimiter:速率限制
  • resilience4j-bulkhead: 舱壁
  • resilience4j-retry:自动重试(同步和异步)
  • resilience4j-timelimiter:超时处理
  • resilience4j-cache:结果缓存

还有用于度量的附加模块、Feign、Kotlin、Spring、Ratpack、Vertx、RxJava2 等。

本文主要讲前三个核心功能,其他的功能可用其他组件替代,并不是王牌。

CircuitBreaker 服务熔断+服务降级

断路器有三个普通状态:关闭(CLOSED)、开启(OPEN)、半开(HALFOPEN),还有两个特殊状态:禁用(DISABLED)、强制开启(FORCED OPEN)。

当熔断器关闭时,所有的请求都会通过熔断器。

  • 如果失败率超过设定的阈值,熔断器就会从关闭状态转换到打开状态,这时所有的请求都会被拒绝
  • 当经过一段时间后,熔断器会从打开状态转换到半开状态,这时仅有一定数量的请求会被放入,并重新计D算失败率
  • 如果失败率超过阈值,则变为心开状态,如果失败率低于阅值,则变为关闭状态

断路器使用滑动窗口来存储和统计调用的结果。你可以选择基于调用数量的滑动窗口或者基于时间的滑动窗口。基于访问数量的滑动窗口统计了最近N次调用的返回结果。居于时间的滑动窗口统计了最近N秒的调用返回结果。

除此以外,熔断器还会有两种特殊状态:DISABLED(始终允许访问)和FORCEDOPEN(始终拒绝访问)。

  • 这两个状态不会生成熔断器事件(除状态装换外),并且不会记录事件的成功或者失败
  • 退出这两个状态的唯一方法是触发状态转换或者重置熔断器.
    在这里插入图片描述
    断路器使用滑动窗口来存储和统计调用的结果。你可以选择基于调用数量的滑动窗口或者基于时间的滑动窗口。基于访问数量的滑动窗口统计了最近N次调用的返回结果。居于时间的滑动窗口统计了最近N秒的调用返回结果。

这三个状态互相转换基于两个条件,基于访问数量的滑动窗口和基于时间的滑动窗口

  • 访问数量:假设十次调用,有6次调用不成功,就是只有40%的通过率,那么就设定为服务异常,断路器打开,服务熔断,进入服务降级
  • 时间:假设最近20s调用,其中有几次调用失败,超过阈值的失败率,就设定服务亚健康状态,断路器打开,服务熔断,进入服务降级

以上都可以通过配置去设定状态之间的转换规则

三种状态转换例子

绿色箭头类似于保险丝,关闭状态时正常使用,a服务请求都可以到b服务中去
在这里插入图片描述

打开状态时,保险丝断开,a服务请求无法到达b服务
在这里插入图片描述

在打开状态后,隔一段时间会变为半开状态,此时a服务会用几个请求去测试连接b服务,如果这几个请求在一定数量和一定时间内请求到b服务成功的话,就会从半开状态回复到关闭状态,如果是请求失败,那么就会变成打开状态。
在这里插入图片描述

参数配置

在这里插入图片描述
在这里插入图片描述
重点关注这几个属性
在这里插入图片描述

案例demo作业

  • 6次访间中当执行方法的失败率达到50%时circuitBreaker将进入开启OPEN状态(保险丝跳闸断电)拒绝所有请求。
  • 等待5秒后,CircuitBreaker 将自动从开启OPEN状态过渡到半开HALF_OPEN状态,允许一些请求通过以测试服务是否恢复正常
  • 如还是异常circuitBreaker 将重新进入开启OPEN状态:如正常将进入关闭CLOSE闭合状态恢复正常处理请求。
    在这里插入图片描述
    可以根据以上参数配置,完成这个demo的流程演示,当做一个小作业。
    代码中如何配置参数以及使用熔断和降级,本文不再赘述,可根据下文相关文献或者其他线上文档进行编码。

BulkHead隔离

Bulkhead(船的)舱壁/(飞机的)隔板
隔板来自造船行业,床仓内部一般会分成很多小隔舱,一旦一个隔舱漏水因为隔板的存在而不至于影响其它隔舱和整体船。

在这里可以理解为,BulkHead就相当于一个九宫格火锅,同时向一个服务发起多个请求,这多个请求就相当于每个格子的菜串串,当一个菜串串里面有虫子时,其他格子的菜品都是好的,不受影响。

特性

Resilience4j提供了两种隔离的实现方式,可以限制并发执行的数量。

SemaphoreBulkhead使用了信号量

信号量舱壁(SemaphoreBulkhead)原理当信号量有空闲时,进入系统的请求会直接获取信号量并开始业务处理。
当信号量全被占用时,接下来的请求将会进入阻塞状态,SemaphoreBukhead提供了一个阻塞计时器,如果阻塞状态的请求在阻塞计时内无法获取到信号量则系统会拒绝这些请求。
若请求在阻塞计时内获取到了信号量,那将直接获取信号量并执行相应的业务处理。

通俗理解:
信号量:相当于一个停车场,停车场只有三个停车位,这三个停车位就是信号量,车子就相当于请求,如果停车位被停满了,那么外面的车子就必须在外面等着,除非有空余停车位,外面车子才能进去。

FixedThreadPoolBulkhead使用了有界队列和固定大小线程池

FixedThreadPoolBukhead的功能与SemaphoreBukhead一样也是用于限制并发执行的次数的,但是二者的实现原理存在差别而且表现效果也存在细微的差别。

FixedThreadPoolBulkhead使用一个周定线程池和一个等待队列来实现舱壁。

当线程池中存在空闲时,则此时进入系统的请求将直接进入线程池开启新线程或使用空闲线程来处理请求。
当线程池中无空闲时时,接下来的请求将进入等待队列,若等待队列仍然无剩余空间时接下来的请求将直接被拒绝,在队列中的请求等待线程池出现空闲时,将进入线程池进行业务处理。
另外:ThreadPoolBulkhead只对CompletableFuture方法有效,所以我们必创建返回CompletableFuture类型的方法)

通俗理解:线程池参数有个最大线程池大小和核心线程池大小,那么可请求的数量就是两者之和,超过这个数量的请求进来,就会被直接拒绝掉。
在这里插入图片描述

限流

所谓限流,就是通过对并发访问/请求进行限,或者对一个时间窗口内的请求进行限速,以保护应用系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。

常见限流算法

  • 漏斗算法
    一个固定容量的漏桶,按照设定常量固定速率流出水滴,类似医院打吊针,不管你源头流量多大,我设定匀速流出。
    如果流入水滴超出了桶的容量,则流入的水滴将会溢出了(被丢弃),而桶容量是不变的。
    缺陷是:面对突发性的流量,无法做出立刻响应,效率低
    在这里插入图片描述

  • 令牌桶算法(springcloud默认该算法)
    在这里插入图片描述

  • 滚动时间窗口算法
    允许固定数量的请求进入(比如1秒取4个数据相加,超过25值就over)超过数量就拒绝或者排队,等下一个时间段进入。由于是在一个时间间隔内进行限制。如果用户在上个时间间隔结束前请求(但没有超过限制),同时在当前时间间隔刚开始请求(同样没超过限创),在各自的时问问隔内,这些请求都是正常的。下图统计了3次。
    但是缺陷是:间隔临界的一段时间内的请求就会超过系统限制,可能导致系统被压垮
    在这里插入图片描述

  • 滑动时间窗口算法
    顾名思义,该时间窗口是滑动的。所以,从概念上讲,这里有两个方面的概念需要理解:
    窗口:需要定文窗口的大小
    滑动:需要定义在窗口中滑动的大小,但理论上讲滑动的大小不能超过窗口大小
    滑动窗口算法是把固定时间片进行划分并且随着时间移动,移动方式为开始时间点变为时间列表中的第2个时间点,结束时间点增加一个时间点。不断重复,通过这种方式可以巧妙的避开计数器的临界点的问题。下图统计了5次
    在这里插入图片描述

参数配置

在这里插入图片描述
可在yml中配置好后,效果为,指定刷新周期内,限制请求进来的请求数量,超过后服务降级提醒

相关文献

CircuitBreaker官网:https://spring.io/projects/spring-cloud-circuitbreaker#overview
Resilience4j github:https://github.com/resilience4j/resilience4j#1-introduction
Resilience4j 官方文档:https://resilience4j.readme.io/docs/circuitbreaker
中文文档:https://github.com/lmhmhl/Resilience4j-Guides-Chinese/blob/main/index.md

就先说到这 \color{#008B8B}{ 就先说到这} 就先说到这
在下 A p o l l o \color{#008B8B}{在下Apollo} 在下Apollo
一个爱分享 J a v a 、生活的小人物, \color{#008B8B}{一个爱分享Java、生活的小人物,} 一个爱分享Java、生活的小人物,
咱们来日方长,有缘江湖再见,告辞! \color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!} 咱们来日方长,有缘江湖再见,告辞!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/747489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22安装PyCharm

下载(社区版) 官网下载地址 解压 sudo tar -xzvf pycharm-community-2024.1.4.tar.gz 软件移动到指定目录下(根据不同版本修改) sudo mv pycharm-community-2024.1.4/ /usr/local/PyCharm/运行 cd /usr/local/PyCharm/pycha…

Altera不同系列的型号命名规则

Altera芯片型号:10AX07H4F34I3SG 20nm工艺 资源: 大数据 云计算 人工智能 图像处理 MSEL

固定翼无人机入门(二)

这里讲讲无人机的路径跟踪控制相关知识,路径跟踪需要制导率(平面)和控制器,在无人机中较为常用的是L1制导率,不过L1制导率是控制无人机在二维平面上的转向,此处还引入总能量控制,控制无人机的高…

Vue3学习笔记<->开发环境安装

背景 公司开始做产品开发,前端就选择使用了vue,替换了传统的jsp。公司要求每个开发人员都要前后端都可以开发,于是就开始学习vue了。 安装环境 安装node.js node.js下载地址:node.js下载地址 安装:选在安装路径&…

Web渗透:逻辑漏洞

逻辑漏洞是指应用程序的逻辑中存在缺陷,导致应用程序无法按照预期执行,可能被攻击者利用来执行未授权的操作或绕过安全措施。逻辑漏洞通常不依赖于常见的输入验证漏洞或技术漏洞,而是利用系统设计或实现中的问题;本文以两个例子举…

makefile中的用户自定义变量

makefile: CC gcc CFLAGS -Isub -Isub -O2 OBJS add_int.o add_float.o sub_int.o sub_float.o main.o TARGET ccb RM rm -f $(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS) $(CFLAGS) $(OBJS):%.o:%.c$(CC) -c $(CFLAGS) $< -o $ clean:-$(RM) $(TARGET) $(OBJS)编译运…

使用命令行创建uniapp+TS项目,使用vscode编辑器

一:如果没有pnpm,先安装pnpm 二:使用npx工具和degit工具从 GitHub 上的 dcloudio/uni-preset-vue 仓库克隆一个名为 vite-ts 的分支,到项目中. 执行完上面命令后,去manifest.json添加appid(自己微信小程序的Id),也可不执行直接下一步,执行pnpm install ,再执行pnpm:dev:mp-weix…

OPenFast中AeroDyn,ElastoDyn,ElastoDyn_Tower,ServoDyn的作用!

在OpenFAST中&#xff0c;这四个文件分别有不同的作用&#xff0c;它们用于定义风力涡轮机不同部分的特性和行为。以下是每个文件的总结及其作用&#xff1a; NRELOffshrBsline5MW_Onshore_AeroDyn15.dat 作用&#xff1a;这是AeroDyn模块的输入文件&#xff0c;用于定义风力涡…

Android C++系列:内存知识整理

1. 控制C的内存分配 在嵌入式系统中使用C的一个常见问题是内存分配&#xff0c;即对new 和 delete 操作符的失控。 具有讽刺意味的是&#xff0c;问题的根源却是C对内存的管理非常的容易而且安全。具体地说&#xff0c;当一个对象被消除时&#xff0c;它的析构函数能够安全的释…

基线核查--渗透

基线检查 基线核查概念 it中定义&#xff1a; 基线为初始的标准&#xff0c;以后更改就要经过授权&#xff0c;形成下一基线。 软件配置管理的基线&#xff1a;1功能基线&#xff0c;分配基线&#xff0c;产品基线 安全配置基线--基线核查 安全基线可以说是木桶理论&…

RocketMQ 和 Kafka 关于消息队列的推拉模式是怎么做的?

引言&#xff1a;在当今的大数据和分布式系统中&#xff0c;消息队列扮演着至关重要的角色&#xff0c;它们作为系统之间通信和数据传输的媒介&#xff0c;为各种场景下的数据流动提供了可靠的基础设施支持。在消息队列的设计中&#xff0c;推拉模式是两种常见的消息传递机制&a…

搜索引擎的原理与相关知识

搜索引擎是一种网络服务&#xff0c;它通过互联网帮助用户找到所需的信息。搜索引擎的工作原理主要包括以下几个步骤&#xff1a; 网络爬虫&#xff08;Web Crawler&#xff09;&#xff1a;搜索引擎使用网络爬虫&#xff08;也称为蜘蛛或机器人&#xff09;来遍历互联网&#…

云计算【第一阶段(21)】引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…

这5款国内可用的宝藏AI视频工具,不允许有人还不知道!(建议收藏)

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 前几天一位粉丝说给…

40.连接假死-空闲检测-发送心跳

连接假死情况 1.网络设备出现故障,例如网卡,机房等。底层的TCP连接已经断开,但应用程序没有感知到,仍然占着资源。 2.公网网络不稳定,出现丢包。若果连续出现丢包,这时现象就是客户端数据发不出去,服务端也一直收不到数据,就这么一直耗着。 3.应用程序线程阻塞,无法…

postman汉化中文(Windows)

Postman 是一款专业的 API 开发工具&#xff0c;为开发者提供了创建、测试、调试和分享 HTTP 请求的便利性和灵活性。其主要功能包括请求构建与发送、自动化测试、团队协作与分享、实时监视与调试以及环境与变量管理。无论是个人开发者还是团队&#xff0c;Postman 都能有效地提…

UDS - 10.2 DiagnosticSessionControl (10) service

10.3 诊断会话控制(10)服务 来自:ISO 14229-1-2020.pdf 10.2.1 服务说明 DiagnosticsSessionControl服务用于在服务器中启用不同的诊断会话。 诊断会话启用服务器中的一组特定诊断服务和/或功能。该服务提供了服务器可以报告对启用的诊断会话有效的数据链路层特定参数值(…

75101A 1553B总线测试模块

75101A 1553B总线测试模块 75101A 1553B总线测试模块是单通道多功能&#xff0c;符合CPCI/PXI总线的标准3U尺寸模块&#xff0c;可同时用作BC、RTs和BM&#xff0c;其中BM具有比特误码、highbit、lowbit、highword、lowword、校验错误、消息错误检测以及最大256M字节的数据捕…

【ZYNQ】VDMA 的介绍

AXI VDMA 是 Xilinx 官方提供的高带宽视频 DMA IP&#xff0c;用于实现 AXI4-Stream 视频数据流与 AXI4 接口数据的转换&#xff0c;同时提供帧缓存与帧同步控制功能。本文主要介绍 AXI VDMA 的基本结构与原理&#xff0c;并简要介绍 VDMA 的配置与使用方法。 目录 1 VDMA 简介…

程序员必备的ChatGPT技巧:从代码调试到项目管理

近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT作为一种强大的对话式AI工具&#xff0c;已经广泛应用于各个领域。而对于程序员来说&#xff0c;ChatGPT不仅可以帮助他们解决编程中的各种问题&#xff0c;还能在项目管理中发挥重要作用。本篇博客将详细介绍…