当前位置: 首页 > news >正文

Java并发编程指南:如何正确使用信号量和线程池熔断机制

前言:

在分布式系统中,选择合适的熔断机制是保护系统免受故障影响的关键。本文将介绍使用信号量和线程池两种常见的熔断机制,并提供Java和Spring Cloud Alibaba框架下的示例代码,帮助您深入理解和应用。

1. 信号量熔断机制

信号量熔断机制基于并发请求的数量进行熔断,可限制系统的并发访问量。它适用于资源有限且对请求响应时间要求较高的场景。下面是使用Java和Spring Cloud Alibaba框架实现信号量熔断机制的示例代码:

配置类

import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;@Configuration
public class CircuitBreakerConfiguration {@Beanpublic Customizer<Resilience4JCircuitBreakerFactory> defaultCircuitBreakerCustomizer() {return factory -> {factory.configureDefault(configuration -> {configuration.circuitBreakerConfig(CircuitBreakerConfig.custom().slidingWindowSize(10).failureRateThreshold(50).waitDurationInOpenState(Duration.ofMillis(1000)).build());});};}
}

业务类


@Service
public class MyService {private final CircuitBreaker circuitBreaker;public MyService(CircuitBreakerFactory circuitBreakerFactory) {this.circuitBreaker = circuitBreakerFactory.create("myService");}@CircuitBreakerFallbackpublic String myMethod() {// 执行业务逻辑// ...}public String myMethodWithCircuitBreaker() {return this.circuitBreaker.run(this::myMethod, throwable -> {// 熔断发生时的处理逻辑,发送警报通知,拓展记录日志等sendAlertNotification();// 执行回退逻辑,抛出自定义异常throw new CustomFallbackException("服务熔断");});}private void sendAlertNotification() {// 发送警报通知的逻辑// ...}private static class CustomFallbackException extends RuntimeException {public CustomFallbackException(String message) {super(message);}}
}

在上述代码中,我们使用Resilience4J库实现了信号量熔断机制。通过CircuitBreakerConfig对象的配置,我们设定了熔断的阈值、失败率和等待时间等参数。在MyServicemyMethodWithCircuitBreaker方法中,我们使用CircuitBreaker来调用myMethod方法,当发生熔断时,会执行处理逻辑。处理逻辑示例中,我们通过sendAlertNotification方法发送了警报通知。回退逻辑示例中,我们抛出了一个自定义的异常,以表明熔断发生。

2. 线程池熔断机制

线程池熔断机制基于线程数来进行熔断,可控制系统中的线程数量,保证系统的稳定性。它适用于请求处理时间较长且需要灵活配置的场景。以下是使用Java和Spring Cloud Alibaba框架实现线程池熔断机制的示例代码:

import java.util.concurrent.*;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;@Service
public class MyService {private final ExecutorService executorService;private final Semaphore semaphore;public MyService() {// 创建线程池this.executorService = new ThreadPoolExecutor(10, 10,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(100),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());this.semaphore = new Semaphore(10); // 设置信号量的限制为10}@SentinelResource(value = "myService", blockHandler = "handleBlockMethod")public String myMethod() {// 执行业务逻辑// ...}public String handleBlockMethod(BlockException ex) {// 熔断发生时的处理逻辑// ...return "Fallback";}public String myMethodWithCircuitBreaker() throws InterruptedException, ExecutionException {Future<String> future = executorService.submit(() -> {semaphore.acquire(); // 获取信号量许可try {return myMethod(); // 执行业务逻辑} finally {semaphore.release(); // 释放信号量许可}});try {return future.get(); // 等待业务方法执行结果} catch (InterruptedException | ExecutionException e) {// 熔断发生,执行回退逻辑return handleBlockMethod(e);}}
}

在上述示例中,我们使用ThreadPoolExecutor来创建一个线程池,并设置相关参数,如核心线程数、最大线程数和线程空闲时间。在方法myMethodWithCircuitBreaker中,我们使用线程池来执行被保护的方法myMethod,并使用Semaphore来限制并发访问量,即限制同时执行的线程数量。在方法中,通过Semaphoreacquirerelease方法获取和释放信号量许可。如果发生熔断,我们执行处理逻辑handleBlockMethod作为回退逻辑。

总结

本文讲解了信号量熔断机制和线程池熔断机制,并给出了Java和Spring Cloud Alibaba框架下的示例代码。选择适合的熔断机制要考虑资源限制、请求处理时间和容错能力等因素。如果你的场景资源有限且需要快速响应请求,那信号量就是个不错的选择。如果你的任务处理时间较长,需要更灵活的配置,那线程池会更适合。要根据实际情况综合考虑,做出最佳的选择。

相关文章:

Java并发编程指南:如何正确使用信号量和线程池熔断机制

前言&#xff1a; 在分布式系统中&#xff0c;选择合适的熔断机制是保护系统免受故障影响的关键。本文将介绍使用信号量和线程池两种常见的熔断机制&#xff0c;并提供Java和Spring Cloud Alibaba框架下的示例代码&#xff0c;帮助您深入理解和应用。 1. 信号量熔断机制 信号…...

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的&#xff1a; 串口屏内部有三个分区&#xff0c;分别为A、B、C三个区&#xff1a; A区&#xff1a;系统区&#xff0c;存储组态工程文件 B区&#xff1a;数据区&#xff0c;存储配置信息&#xff0c;记录数据、历史曲线等 C区&#xff1a;备…...

php之 角色的权限管理(RBAC)详解

RBAC&#xff08;Role-based access control&#xff09;是一种常见的权限管理模型&#xff0c;通过将用户分配至特定的角色&#xff0c;以及为角色分配访问权限&#xff0c;实现了权限管理的目的。以下是关于RBAC的详细解释&#xff1a; 角色&#xff1a;RBAC模型的核心是角色…...

asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乡村旅游管理系统是一套完善的web设计管理系统系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net乡村旅游管理系统 二、…...

【linux】文件系统+软硬连接+动静态库

文件系统软硬连接动静态库 1.理解文件系统1.1磁盘的物理结构1.2磁盘的存储结构1.3磁盘的逻辑结构1.4文件系统 2.软硬链接2.1什么是软硬链接2.2软硬链接的作用 3.动静态库3.1什么是库3.1静态库和静态链接3.2动态库和动态链接3.2.1通过环境变量找到动态库路径3.2.2把动态库拷贝到…...

力扣每日一题73:矩阵置零

题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2…...

vscode C++项目相对路径的问题

如图所示的项目目录结构 如果要在main.cpp里用相对路径保存一个txt文件 std::ofstream file("./tree_model/my_file.txt");if (file.is_open()) {file << "This is a sample text.\n";file.close();std::cout << "File saved in the mode…...

视频转换器WinX HD Video Converter mac中文特点介绍

WinX HD Video Converter mac是一款功能强大的视频转换器&#xff0c;它可以将各种不同格式的视频文件转换为其他视频格式&#xff0c;以便用户在各种设备上进行播放。WinX HD Video Converter是一个功能强大、易于使用的视频转换器&#xff0c;适用于各种类型的用户&#xff0…...

数据隐私保护的方法有哪些?

数据隐私保护的方法有哪些&#xff1f; 安企神U盘管理系统下载使用 互联网时代的到来&#xff0c;给我们的生活带来极大的方便&#xff0c;但也给我们保护隐私数据带来巨大的挑战&#xff0c;数据隐私保护是确保个人或企业数据和敏感信息不被未经授权的访问或滥用的关键问题。…...

【Linux】解决缓存锁问题:无法获得锁 /var/lib/dpkg/lock-frontend

今天在运行apt-get update更新软件包后&#xff0c;突然发现安装新的软件出现了这个报错&#xff1a;正在等待缓存锁&#xff1a;无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1855&#xff08;unattended-upgr&#xff09;持有。如图。 这个错误通常是由于其他进程正在…...

嵌入式软件开发工程师应该关注芯片数据手册中的哪些信息

1. 芯片的架构和处理器类型&#xff1a;了解芯片的架构和处理器类型可以帮助开发人员选择合适的开发工具和编程语言。 2. 芯片的时钟频率和电源要求&#xff1a;了解芯片的时钟频率和电源要求可以帮助开发人员设计合适的电路和电源系统。 3. 芯片的存储器类型和容量&#xff…...

基于数字电路交通灯信号灯控制系统设计-单片机设计

**单片机设计介绍&#xff0c;1617基于数字电路交通灯信号灯控制系统设计&#xff08;仿真电路&#xff0c;论文报告 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 交通灯控制系统在城市交通控制中发挥着重要的作用&#xf…...

Spring Boot 配置邮件发送服务

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/ctwkrus1r9zrytsq spring boot 版本 3.1.3 邮件发送服务使用的 QQ 邮箱提供的 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent…...

【Spring】快速入门Spring Web MVC

文章目录 1. 什么是Spring Web MVC1.1 MVC1.2 Spring MVC 2. 使用Spring MVC2.1 项目创建2.2 建立连接2.2.1 RequestMapping 注解2.2.2 RestController 注解2.2.3 RequestMapping 使⽤2.2.4 RequestMapping 是什么请求&#xff1f;POST&#xff1f;GET&#xff1f;…&#xff1…...

python---continue关键字对for...else结构的影响

代码&#xff1a; str1 laowang for i in str1:if i w:print(遇w不打印)continueprint(i) else:print(循环正常结束之后执行的代码) 图示&#xff1a;...

小结笔记:多位管理大师关于管理的要素的论述

最近在看《刘澜管理学》&#xff0c;其中有提到多位管理大师关于管理的要素的论述,笔记如下&#xff1a; 法约尔的管理五要素 这就是在前言中提到过的法约尔的管理五要素模型。 第一个“管理”学者 法约尔可以说是第一个专门的“管理”学者。在法约尔之前&#xff0c;没有人专门…...

sql---慢查询和语句耗时

查看当前会话的所有的sql语句耗时情况 profile 开启 查询指定sql的各个阶段耗时 查看执行计划指令 Explain Explain select * from 表 Index 和 all 属于性能不太好 在不扫描得的情况下才可能为null&#xff0c;index表示使用了索引但是扫描了所有的索引&#xff…...

ChinaSoft 论坛巡礼 | 智慧化 IDE 论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…...

数字孪生智慧工厂三维可视化系统解决方案,打造新一代智慧工厂

在制造业的快速发展和数字化转型的时代&#xff0c;智慧工厂已经成为制造企业前进的必经之路。数字孪生技术&#xff0c;作为工业数字化转型的核心动力&#xff0c;为打造智慧工厂提供了关键支持。其中&#xff0c;数字孪生智慧工厂三维可视化系统解决方案无疑是制造企业的得力…...

并查集学习心得

int find(int x)//并查集找父亲 {if(x!fa[x]) fa[x]find(fa[x]);return fa[x]; } void add(int x,int y)//合并 {int fxfind(x);int fyfind(y);if(x!y) fa[fx]fy; } P1197 [JSOI2008] 星球大战 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 洛谷p1197星球大战 :并查集逆向…...

谷氨酸发酵过程的软测量建模【附模型】

✨ 长期致力于软测量、谷氨酸发酵、动力学模型、支持向量机、高斯过程、变量选择、异常状态研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;多阶段高斯…...

全球无障碍宣传日:iOS 26 辅助功能大升级,这些实用小功能你用过吗?

辅助功能发展与升级很多人对辅助功能的印象还停留在 "小白点"&#xff0c;但随着 iPhone 进入全面屏时代&#xff0c;它逐渐变得陌生。实际上&#xff0c;Apple 每年都会为其增添功能&#xff0c;方便身体有障人士使用 iPhone。而且&#xff0c;这些功能不仅惠及有障…...

为什么你的DeepSeek微调loss震荡不止?(Meta/DeepSeek联合团队未公开的梯度裁剪+LoRA初始化双校准协议)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek微调loss震荡的根本归因剖析 DeepSeek系列模型在微调过程中频繁出现loss剧烈震荡现象&#xff0c;其本质并非单一因素所致&#xff0c;而是数据、优化器、梯度动态与模型结构四者耦合失稳的系统性表现…...

人工智能的伦理与安全:这3个问题,软件测试从业者必须重视

随着大语言模型、生成式AI的爆发式落地&#xff0c;人工智能已经从实验室走向千行百业的生产场景&#xff0c;深刻改变着软件开发与交付的逻辑。对于直接把控产品质量关口的软件测试从业者来说&#xff0c;我们的职责早已不再是单纯验证功能可用性、排查性能bug那么简单——AI系…...

Python strip 与 rstrip 函数区别

Python strip 与 rstrip 函数区别 文章目录Python strip 与 rstrip 函数区别一、核心作用二、基础语法三、基础使用示例四、指定删除特定字符五、常用业务场景一、核心作用 函数作用范围strip()移除字符串首尾空白字符rstrip()仅移除字符串右侧末尾字符&#xff0c;左侧保持不…...

ZYNQ中断避坑指南:PL端信号线如何正确‘连线’到PS端处理函数?

ZYNQ中断系统深度解析&#xff1a;从硬件信号到软件响应的全链路实践 在嵌入式系统开发中&#xff0c;中断处理是实时响应的核心机制。对于ZYNQ这种集成了ARM处理器(PS)和可编程逻辑(PL)的异构计算平台&#xff0c;其中断系统既有传统处理器的特性&#xff0c;又具备FPGA灵活定…...

揭秘Midjourney云雾渲染失效真相:3大隐性提示词冲突、2类SDXL迁移兼容漏洞及实时雾浓度校准公式

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;揭秘Midjourney云雾渲染失效真相&#xff1a;3大隐性提示词冲突、2类SDXL迁移兼容漏洞及实时雾浓度校准公式 Midjourney V6 在启用云雾&#xff08;mist/fog/haze&#xff09;类视觉效果时&#xff0c;…...

别再只会用--nogpgcheck了!手把手教你安全修复PostgreSQL yum源的GPG密钥问题

企业级PostgreSQL部署&#xff1a;安全解决GPG密钥验证的完整方案 当你在生产环境中部署PostgreSQL时&#xff0c;遇到GPG签名验证错误直接使用--nogpgcheck绕过检查&#xff0c;就像因为门锁打不开就直接把门拆掉一样危险。本文将带你深入理解GPG验证机制&#xff0c;并提供一…...

3步掌握OpenSpeedy:免费开源游戏加速工具使用指南

3步掌握OpenSpeedy&#xff1a;免费开源游戏加速工具使用指南 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否曾为游戏卡顿而烦恼&#xff1f;是否希望在单机游戏中加快…...

Diablo Edit2:3步掌握暗黑破坏神2存档修改的终极秘籍

Diablo Edit2&#xff1a;3步掌握暗黑破坏神2存档修改的终极秘籍 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 还在为暗黑破坏神2中刷装备的漫长过程感到疲惫吗&#xff1f;Diablo Edit2这款免费…...