【一天一坑系列】系统接口调用过程中,Hystrix居然“莫名其妙”的熔断降级到了fallback方法,并且无法恢复

1、异常描述

近期做了一个功能模块的限流熔断处理,使用的是hystrix来做熔断处理。具体的配置如下:

@DefaultProperties(defaultFallback = "customFallBackMethod",commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),  //是否开启断路器,默认true@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "100"),   //时间窗口时间内最大并发请求次数,默认20次@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "2000"),   //时间窗口时长,默认10s@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000"),  //熔断后恢复间隔时间范围,默认5s@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "0"),//失败率达到多少后跳闸,默认50})


        在需要熔断的接口上,加了@HystrixCommand注解;在启动类上也加上了@EnableHystrix注解,如此一来熔断配置就会生效啦。

        配置信息就是这样啦,主要想实现的效果就是,在指定时间周期内,并发请求达到多少,就熔断处理。例如我这里写的,2秒内如果并发请求超过100次,就进入熔断降级的方法customFallBackMethod中,5秒后恢复。失败率是0,即只要并发数据量超过配置,就熔断。
坑就坑在:其中有一个被调用的接口,没有抛出异常,也没有返回空值,也没有执行很耗时间,但是基本上调用都会被熔断,从而进入降级的方法中,导致功能无法正常使用,简直莫名其妙,还刚好在上线发版时出现了,一头雾水~~~,没有办法只好先撤掉Hystrix的熔断配置,恢复功能使用。


2、分析这个坑

后来在本地启动服务,想验证一下接口的具体情况,果然复现了,同样的配置,这个接口依然基本都是熔断降级响应。通过打断点,我发现在如下这个方法执行时,

 会进入到一个异常抛出的程序:


具体报错信息如下:

### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: interrupt
### The error may exist in ***/mapper/xxxMapper.java (best guess)
### The error may involve ***.mapper.xxxMapper.selectOne
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: interrupt

这里会发现有一个数据库的连接异常,所以导致了hystrix的熔断处理,进入到了降级方法中。

但是为什么会出现这个异常呢,通过了解hystrix的执行原理,其执行流程大概如下:


        所以其实是hystrix创建的新线程在执行sql前,通过mybatis-plus去获取JDBC的连接超时失败了,导致了这个异常的产生,从而进入了熔断。
        那这里再去具体分析一下,为啥获取JDBC的连接时会失败呢,主要原因其实就是执行超时了。超过了hystrix的执行响应时长。


3、解决这个坑

目前有2种解决方式:
第一种,将hystrix的线程执行响应时长延长。由于我本身没有设置这个配置项:

@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"

所以,默认响应超时时间为1秒,因此我们把时长增加到一个适当的时间,即可以解决。例如我们设置为3000毫秒。

第二种,在接口的执行方法上,加上@Transactional注解,使mybatis-plus在获取jdbc连接时,可以直接使用spring的事务上下文快速获取到JDBC连接,从而不至于导致超时产生异常。但是,保险起见,还是需要在第一种方式下,增加一下合理的超时时限,这样才能更好的保障程序的正常运行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第5题最长回文子串

题目&#xff1a; 题解&#xff1a; class Solution {public String longestPalindrome(String s) {int start 0, end -1;StringBuffer t new StringBuffer("#");for (int i 0; i < s.length(); i) {t.append(s.charAt(i));t.append(#);}t.append(#);s t.to…

深入理解Java内存模型及其作用

目录 1.前言 2.为什么要有 Java 内存模型&#xff1f; 2.1 一致性问题 2.2 重排序问题 3.Java 内存模型的定义 4.规范内容 4.1 主内存和工作内存交互规范 4.2 什么是 happens-before 原则&#xff1f; 1.前言 当问到 Java 内存模型的时候&#xff0c;一定要注意&#…

Docker 哲学 - push 本机镜像 到 dockerhub

注意事项&#xff1a; 1、 登录 docker 账号 docker login 2、docker images 查看本地镜像 3、注意的是 push镜像时 镜像的tag 需要与 dockerhub的用户名保持一致 eg&#xff1a;本地镜像 express:1 直接 docker push express:1 无法成功 原因docker不能识别 push到哪里 …

磁盘如何分配数据数据

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 磁盘如何分配数据 数据切割&#xff1a; 按照固定长度进行切割---》编码翻译&#xff08;常用&#xff09; 计算机要求按照8bit(字节)进…

MySQL 8.0.13安装配置教程

写个博客记录一下&#xff0c;省得下次换设备换系统还要到处翻教程&#xff0c;直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件&#xff0c;并用编辑器写入如下数据 [mysqld] [client] port…

01 Python进阶:正则表达式

re.match函数 使用 Python 中的 re 模块时&#xff0c;可以通过 re.match() 函数来尝试从字符串的开头匹配一个模式。以下是一个简单的详解和举例&#xff1a; import re# 定义一个正则表达式模式 pattern r^[a-z] # 匹配开头的小写字母序列# 要匹配的字符串 text "h…

【HTML】标签学习(下.2)

&#xff08;大家好哇&#xff0c;今天我们将继续来学习HTML&#xff08;下.2&#xff09;的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二.列表标签 2.1 无序列表(重点) 2.2有序列表(理解) 2.3 自定义列表(重点…

QT网络调试助手

QT网络调试助手 1.开发流程 2.QTtcp服务器   1.1 服务端数据读取   1.2 服务端发送数据-所有客户端   1.3 服务端自动刷新ip地址   1.4 服务端检测客户端断开状态   1.5 服务端发送数据-指定特定客户端发送数据   1.6 服务端停止监听和断开 3.QTtcp客户端 1…

mathematical-expression(MAE)数学表达式 数学函数 解析编译库,有效的快速和简单易用的数学和计算机的编译器

数学表达式 Switch to English Document 介绍 本框架是一种针对数学公式解析的有效工具&#xff0c;能够解析包含嵌套函数&#xff0c;包含函数&#xff0c;数列步长累加等数学公式&#xff0c;返回值是一个数值的结果对象&#xff0c;同时也可以进行比较运算的操作&#xf…

为什么蓝牙信道探测将引领高精度定位服务?

从蓝牙耳机到智能家居设备&#xff0c;蓝牙技术因其成熟的音频流和数据传输功能已成为我们生活中的一部分。一项新技术——蓝牙信道探测&#xff08;Bluetooth Channel Sounding&#xff09;正向高精度定位服务市场迈进。 本文信驰达&#xff08;RF-star&#xff09;将介绍蓝牙…

数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)电子科技数码爱好者交流信息新闻畅聊讨论评价

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

使用TCP协议就一定零丢包了吗?

简述数据包发送流程 为了简化模型&#xff0c;我们把中间的服务器给省略掉&#xff0c;假设这是个端到端的通信。且为了保证消息的可靠性&#xff0c;它们之间用的是TCP协议进行通信。 为了发送数据包&#xff0c;两端首先会通过三次握手&#xff0c;建立TCP连接。 一个数据包&…

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图)

目录 前言 一、图片是否有法线贴图的视觉区别 二、有视觉区别的原因 三、法线贴图的作用 四、信息是如何存进去的 五、自己写一个Shader用到法线贴图 六、注意事项 七、作者的话 前言 本小节会给大家解释&#xff0c;什么是法线贴图&#xff1f;为什么法线贴图会产生深…

Spring源码分析(BeanFactory)

文章目录 Spring源码分析&#xff08;BeanFactory&#xff09;一、BeanFactory二、ApplicationContext 的父系1、HierarchicalBeanFactory2、ListableBeanFactory3、EnvironmentCapable4、ApplicationEventPublisher5、MessageSource6、ResourcePatternResolver 三、Applicatio…

了解这些技术:Flutter应用顺利登陆iOS平台的步骤与方法

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

【鹅厂摸鱼日记(一)】(工作篇)认识八大技术架构

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:重生之我在鹅厂摸鱼⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多知识   &#x1f51d;&#x1f51d; 认识八大架构 1. 前言2. 架构简介&…

【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、ShardingSphere简介 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c;它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar&#xff08;计划中&#xff09;这3款相互独立的产品组成…

【2024 信息素养大赛c++模拟题】算法创意实践挑战赛(基于 C++)

一、 比赛简介 国务院发布《国务院关于印发新一代人工智能发展规划的通 知》&#xff0c;明确实施全民智能教育项目。教育部印发《2019 年教育信息 化和网络安全工作要点》&#xff0c;推动在中小学阶段设置人工智能相关课 程&#xff0c;逐步推广编程教育。本赛项是在贯彻…

Linux学习笔记————C 语言版 LED 灯实验

这里写目录标题 一、实验程序编写二、 汇编部分实验程序编写三、C 语言部分实验程序编写四、编译下载验证 汇编 LED 灯实验中&#xff0c;我们讲解了如何使用汇编来编写 LED 灯驱动&#xff0c;实际工作中是很少用到汇编去写嵌入式驱动的&#xff0c;毕竟汇编太难&#xff0c;而…

用于HUD平视显示器的控制芯片:S2D13V40

一款利用汽车抬头显示技术用于HUD平视显示器的控制芯片:S2D13V40。HUD的全称是Head Up Display&#xff0c;即平视显示器&#xff0c;以前应用于军用飞机上&#xff0c;旨在降低飞行员需要低头查看仪表的频率。起初&#xff0c;HUD通过光学原理&#xff0c;将驾驶相关的信息投射…