CircuitBreaker断路器与Resilience4J简单介绍

CircuitBreaker断路器

介绍

目的:避免级联故障

解决:快速返回失败处理,或者返回默认的兜底处理结果

形象比喻:保险丝开关,闭合可通,打开不可通


功能

  1. 服务熔断:达到最大访问,拒绝访问,调用服务降级进行兜底处理

  2. 服务降级:返回简单提示,不导致服务雪崩

  3. 服务限流:限制访问并发量(前面加一个限流器)

  4. 服务限时

  5. 服务预热

服务熔断会调用服务降级

CircuitBreaker是抽象的规范

Resilience4J实现了规范

实现

正常状态:close状态

服务或组件出故障:open状态

一段时间后:尝试闭合Half_Open状态,多个请求探路,可用转close状态,不可用open状态

Resilience4J

介绍

轻量级容错库,服务熔断,降级

实现CircuitBreaker规范

最低java17

三大核心模块:

  1. resilience4j-Circuitbreaker:断路

  2. resilience4j-bulkhead:舱壁

  3. resilience4j-ratelimiter:速率限制


功能

熔断(服务熔断+服务降级)

断路器状态转换

正常请求:close 断电不可用:open 半开:Half_Open

断路器使用滑动窗口判断结果

基于数量的滑动窗口:最近n次调用

基于时间的滑动窗口:最近n秒调用


两种特殊状态:

  • DISABLE 始终拒绝访问

  • FORCED_OPEN 始终允许访问

不会发生熔断时间

退出状态的唯一方式就是触发状态转换或者重置熔断器


隔离

限制并发执行的数量

实现方式:

  • SemaphoreBulkhead使用信号量

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

Blukhead配置

配置属性 默认值 描述
maxConcurrentCalls 25 隔离允许线程并发执行的最大数量
maxWaitDuration 0 当达到并发调用数量时,新的线程将被阻塞的最长的等待时间
SemaphoreBulkhead信号量舱壁

信号量空闲,直接获取信号量处理业务

信号量全占,下一个请求阻塞,设置有阻塞计时器

阻塞计时器内还无法获得信号量则拒绝请求

阻塞计时器内获得信号量,正常处理业务

FixedThreadPoolBulkhead固定线程池舱壁

使用一个固定的线程池和一个等待队列实现舱壁

线程池存在空闲,直接进入线程池处理请求

线程池无空闲进入等待队列

等待队列无剩余空间拒绝请求

线程池出现空闲则处理队列中的请求

ThreadPoolBulkhead只对CompletableFuture方法有效,必须创建返回CompletableFuture类型的方法

限流

限制最大访问流量,针对并发/一个时间窗口的访问/请求进行限速

漏桶算法

设定常量固定流速

设置两个变量:

  1. 桶的大小:可以存多少请求,请求数量超过则舍弃

  2. 水桶漏洞大小:处理请求的固定流速

对于存在突发特性的流量缺乏效率

令牌桶算法(springcloud默认使用)

设置令牌数量,每一个请求有令牌才能使用,执行完毕,令牌回收,发给排队请求

滚动时间窗口算法

允许固定数量的请求进入,超过数量拒绝或排队,等待下一个时间段

计时器算法存在时间临界点缺陷,在时间临界点左右的极端时间内容易遭到攻击(加倍过载)

滑动时间窗口算法

设置两个变量

  1. 窗口大小

  2. 滑动窗口大小

滑动窗口大小不超过窗口大小

把固定时间片进行划分并且随时间移动,可以避开计时器的临界点问题

你可能感兴趣的:(springcloud,1024程序员节,java,spring,cloud)