Resilience4J之隔离(BulkHead)

2024-03-07 15:12

本文主要是介绍Resilience4J之隔离(BulkHead),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Resilience4J之隔离(BulkHead)

中文官网https://github.com/lmhmhl/Resilience4j-Guides-Chinese/blob/main/core-modules/bulkhead.md

作用是:限制并发。

依赖隔离&负载保护:用于限制对于下游服务的最大并发数量的限制

maven依赖

<!--resilience4j-bulkhead-->
<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-bulkhead</artifactId>
</dependency>

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

1.信号量舱壁(SemaphoreBulkhead)

信号量舱壁(SemaphoreBulkhead)原理

当信号量有空闲时,进入系统的请求会直接获取信号量并开始业务处理。

当信号量全被占用时,接下来的请求将会进入阻塞状态,SemaphoreBulkhead提供了一个阻塞计时器,

如果阻塞状态的请求在阻塞计时内无法获取到信号量则系统会拒绝这些请求。

若请求在阻塞计时内获取到了信号量,那将直接获取信号量并执行相应的业务处理。

2.客户端 application.yaml配置
####resilience4j bulkhead 的例子
resilience4j:bulkhead:configs:default:maxConcurrentCalls: 2 # 隔离允许并发线程执行的最大数量maxWaitDuration: 1s # 当达到并发调用数量时,新的线程的阻塞时间,我只愿意等待1秒,过时不候进舱壁兜底fallbackinstances:cloud-payment-service:baseConfig: defaulttimelimiter:configs:default:timeout-duration: 20s
3.客户端方法
@GetMapping(value = "/feign/pay/bulkhead/{id}")
@Bulkhead(name = "cloud-payment-service",fallbackMethod = "myBulkheadFallback",type = Bulkhead.Type.SEMAPHORE)
public String myBulkhead(@PathVariable("id") Integer id)
{return payFeignApi.myBulkhead(id);
}public String myBulkheadFallback(Throwable t){return "myBulkheadFallback,隔板超出最大数量限制,系统繁忙,请稍后再试-----/(ㄒoㄒ)/~~";}
2.固定线程池舱壁(FixedThreadPoolBulkhead)

FixedThreadPoolBulkhead的功能与SemaphoreBulkhead一样也是用于限制并发执行的次数的,但是二者的实现原理存在差别而且表现效果也存在细微的差别。FixedThreadPoolBulkhead使用一个固定线程池和一个等待队列来实现舱壁。

当线程池中存在空闲时,则此时进入系统的请求将直接进入线程池开启新线程或使用空闲线程来处理请求。

当线程池中无空闲时时,接下来的请求将进入等待队列,

若等待队列仍然无剩余空间时接下来的请求将直接被拒绝,

在队列中的请求等待线程池出现空闲时,将进入线程池进行业务处理。

另外:ThreadPoolBulkhead只对CompletableFuture方法有效,所以我们必创建返回CompletableFuture类型的方法

消费端application.yaml配置
resilience4j:timelimiter:configs:default:timeout-duration: 10s #神坑的位置,timelimiter 默认限制远程1s,超于1s就超时异常,配置了降级,就走降级逻辑thread-pool-bulkhead:configs:default:#可容纳请求数为 max-thread-pool-size  + queue-capacitycore-thread-pool-size: 1max-thread-pool-size: 1queue-capacity: 1instances:cloud-payment-service:baseConfig: default
java代码
    @GetMapping(value = "/feign/pay/bulkhead/{id}")@Bulkhead(name = "cloud-payment-service",fallbackMethod = "myBulkheadPoolFallback",type = Bulkhead.Type.THREADPOOL)public CompletableFuture<String> myBulkheadTHREADPOOL(@PathVariable("id") Integer id){System.out.println(Thread.currentThread().getName()+"\t"+"enter the method!!!");try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(Thread.currentThread().getName()+"\t"+"exist the method!!!");return CompletableFuture.supplyAsync(new Supplier<String>() {@Overridepublic String get() {return "Bulkhead.Type.THREADPOOL";}});}public CompletableFuture<String> myBulkheadPoolFallback(Integer id,Throwable t){return CompletableFuture.supplyAsync(() -> "Bulkhead.Type.THREADPOOL,系统繁忙,请稍后再试-----/(ㄒoㄒ)/~~");}

这篇关于Resilience4J之隔离(BulkHead)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783931

相关文章

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2

MySQL中隔离级别的使用详解

《MySQL中隔离级别的使用详解》:本文主要介绍MySQL中隔离级别的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言undo log的作用MVCC的实现有以下几个重要因素如何根据这些因素判断数据值?可重复读和已提交读区别?串行化隔离级别的实现幻读和可

国产隔离放大器:增强信号完整性和系统安全性的指南

隔离放大器是电子领域的关键组件,特别是在信号完整性和电气隔离至关重要的应用中。这些放大器隔离输入和输出信号,使它们能够在没有直接电气连接的情况下跨不同系统传输数据。这确保了电路一部分的高压尖峰或噪声不会影响另一部分,从而保护了系统和用户。随着国产隔离放大器的不断发展,它们提供了性能、可靠性和成本效益的完美结合,使其成为工程师和系统设计师的理想选择。 1. 了解国产隔离放大器的优势 增强信号

oracle事务隔离级别

文章目录 数据库事务概况1.事务相关概念2.事务的四个特性ACID : oracle事务隔离级别1 .两个事务并发访问数据库数据时可能存在的问题 数据库事务概况 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退。 1.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数据库,执行DML、DCL、DDL语

Java类加载器--使用自定义类加载器实现模块隔离

在看下面的实现之前,可以先了解下面的几篇文章内容: 1 https://blog.csdn.net/u013412772/article/details/80837735 2 https://blog.csdn.net/u013412772/article/details/80842636 3 https://blog.csdn.net/u013412772/article/details

深入了解数字隔离器:革命性的隔离技术

数字隔离器已成为光耦合器的一种更优越的替代品,具有尺寸更小、速度更快、功耗更低、集成更简单和可靠性更高等优点。 在过去,设计工业、医疗和其他隔离系统的工程师在安全隔离方面的选择有限,通常默认使用光耦合器。如今,数字隔离器提供了更先进的解决方案,在性能、紧凑性、能效和成本效益方面均表现出色。选择合适的数字隔离器需要了解三个关键方面:绝缘材料、内部结构和数据传输方法。 使用隔离主要是为了符合安全标

mysql 种隔离级别 以及每种级别对应的问题

mysql 4种隔离级别(1)未提交读(2)提交读(3)可重复读(4)串行化 (1)幻读:t1查询出两天记录,此时t2插入一条id=3的记录然后commit,t1此时插入id=3的记录 报主键错误,对与delete和insert。(2)不可重复读:t1查出id=1的记录name=a,此时t2修改id=1的name=b并commit。此时t1再次查询出id=1的name=b,导致两次查询出的数

Mysql的四个隔离级别 与mvcc(2)

特殊颜色字体为自己总结,关于mvcc直接看最后面的。 一、Mysql的四个隔离级别 预备工作: 先创建一个test数据库及account表, create database test;use test;create table account(id int not null,balance float not null,PRIMARY KEY ( id)) 向accoun

mysql隔离级别与mvcc 关系的理解

MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。 主要通过以下两个方式组合 来实现隔离级别的 版本链:用于存储历史已经完成的事务版本。 readview:主要就是有个列表来存储我们系统中当前活跃着的读写事务,也就是begin了还未提交的事务 在Mysql的In