jasypt组件死锁bug案例分享

这篇具有很好参考价值的文章主要介绍了jasypt组件死锁bug案例分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

事故描述

1、上午9.55发布了一个Apollo动态配置参数;

2、片刻后,服务器接口开始出现大量的超时告警,似乎是某资源被耗尽不足分配;

3、正值业务请求高峰的上午十点(平台上午10点会有一些活动会拉一波用户流量);

4、考虑是否是机器资源不足导致无法承载用户并发量,其实不是,还是跟Apollo发布配置有关;

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

5、进行服务器资源观测,发现14台机器只有1台机器线程数急剧飙升,并且出现了死锁线程(平台分析工具或jstack),超时告警也都集中出现在这一台机器上;

6、赶紧进行对应机器重启先解除故障

7、随后进行dubbo支持的离线jstack-log分析;

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

从dubbo源码可以看到AbortPolicyWithReport继承自AbortPolicy,AbortPolicy的默认行为是如果任务超过线程池的最大处理能力则直接拒绝任务并抛出异常。而AbortPolicyWithReport除了抛出异常外,还打印了一条非常详细的日志,该日志包含了线程池的详细配置,并且在用户的家目录下面导出了一个Dubbo_JStack.log文件。

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

原因分析

jasypt-spring-boot-starter是干嘛的?

Jasypt(Java Simplified Encryption)是一个用于Java应用程序的简单加密库,它提供了各种加密算法和解密工具。jasypt-spring-boot-starter是一个Spring Boot Starter,用于在Spring Boot应用程序中方便地集成Jasypt,以实现配置文件的加密和解密。在 Apollo 中添加配置项,将数据库密码进行加密保存。确保配置项的值以 ENC() 开头,表示它是一个加密过的值。例如,假设你的数据库密码是 password,加密后的值为 ENC(加密后的密码)

为什么会出现死锁现象?

CachingDelegateEncryptablePropertySource中getProperty方法中存在加锁操作(多把锁),且加锁的顺序不是一致的!

图1:

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

图2:

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

上图2中的source就是图1中的delegate

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

如上图,最终会在for循环中重新访问到:

com.ulisesbocchio.jasyptspringboot.caching.CachingDelegateEncryptablePropertySource#getProperty

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

简化后的加锁分析图如上图,因为加锁的目标是this:即CachingDelegateEncryptablePropertySource的实例对象,而这种实例对象又存在多个,就是代表有多把锁的存在。那么就会存在如上图所示的场景,如果apollo触发了更新,而此刻又有大量的线程在访问property资源,那么在极端情况下就会触发这个死锁现象!这也是14台机器只有一台出现死锁问题的原因。后面找了github,也确实是存在这个问题。

官方解释及如何解决

Issues · ulisesbocchio/jasypt-spring-boot · GitHub

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

jasypt组件死锁bug案例分享,并发编程,最佳实践,bug,java,jasypt,并发,死锁

加锁目标改用属性名称的字符串常量值,这样多线程并发访问某个name时,加锁的目标是固定的,锁也是同一把,不存在多把锁,这样就避免了死锁文章来源地址https://www.toymoban.com/news/detail-861470.html

解决:升级版本到3.0.4以上!

到了这里,关于jasypt组件死锁bug案例分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java并发教程_编程入门自学教程_菜鸟教程-免费教程分享

    Java并发教程 Java并发 - 概述 Java并发 - 环境设置 Java并发 - 主要操作 深入沟通 Java并发 - 同步 Java并发 - 死锁 Java并发 - ThreadLocal类 ThreadLocalRandom类 Java并发 - 锁接口 Java并发 - ReadWriteLock接口 Java并发 - 条件接口 Java并发 - AtomicInteger类 Java并发 - AtomicLong类 Java Concurrency - AtomicBoole

    2024年02月05日
    浏览(26)
  • 加密组件Jasypt学习、实战及踩坑记录

    最近入职新公司,因几乎全部项目都使用到jasypt,故而初步学习记录下本文(持续更新)。 官网及GitHub给出的简介:使用简单,性能好,特性features非常丰富;支持 另,有个开源Jasypt-spring-boot组件,GitHub,集成Jasypt,方便Spring Boot开发者使用。 开发中最常见的场景就是对数据

    2023年04月16日
    浏览(10)
  • Scala第二十章节(Akka并发编程框架、Akka入门案例、Akka定时任务代码实现、两个进程间通信的案例以及简易版spark通信框架案例)

    章节目标 理解Akka并发编程框架简介 掌握Akka入门案例 掌握Akka定时任务代码实现 掌握两个进程间通信的案例 掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用工具包。Akka是使用scala开发的库,

    2024年04月11日
    浏览(15)
  • 【JavaScript】JS实用案例分享:动态生成分页组件 | 通过按键实现移动控制

    CSDN话题挑战赛第2期 参赛话题:学习笔记 🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路( 源创征文一等奖作品 ):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 🧑‍💼 个人简介

    2023年04月21日
    浏览(18)
  • Golang Channel详解:安全并发通信与避免死锁方法

    深入了解Golang中的Channel,探讨其线程安全性、类型特性以及避免死锁的方法。学习如何正确初始化、存取数据,关闭Channel以及处理只读只写情况。

    2024年02月10日
    浏览(19)
  • 线程的深入理解(二):死锁和更多的并发安全(1)

    // Bug.addStatic();//静态方法同步 } } 测试代码 public static void main(String[] args) { BugRunnable bugRunnable = new BugRunnable(); for (int i = 0; i 6; i++) { new Thread(bugRunnable).start(); } } 同步代码块 //同步代码块 public synchronized void addBlock() { synchronized (bugNumber) { this.bugNumber = ++bugNumber; System.out.println(“b

    2024年04月11日
    浏览(11)
  • GreatSQL 死锁案例分析

    客户业务发生死锁的报错,根据业务程序日志及业务流程,发现造成死锁的原因是:事务1 delete + insert ,事务2 delete + insert 2个事务交替执行导致的死锁;由于GAP锁阻塞了插入意向锁,并且当delete的数据存在时死锁不会发生,当delete的数据不存在时,会发生死锁。 本次测试基

    2024年04月22日
    浏览(6)
  • Spring Boot项目使用 jasypt 加密组件进行加密(例如:数据库、服务的Key、等等进行加密)

    🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝 🍓 更多文章请点击 密码配置项都不加密? 想啥呢? 一

    2024年02月07日
    浏览(22)
  • MySQL线上死锁案例分析

    项目开发中有两张表: c_bill (账单表), c_bill_detail (账单明细表),他们的表结构如下(这里只保留必要信息): c_bill 表跟 c_bill_detail 表是 1对多 的关系, c_bill 表中的 invoice_amount 是由 c_bill_detail 表中的 invoice_amount 统计出来的。 统计sql如下: 业务层面,账单进行开发票操作

    2024年02月04日
    浏览(13)
  • JavaEE之多线程编程:5. 死锁(详解!!!)

    死锁是这样的一种情形:多个同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 【举个例子理解死锁】 张三李四两人去吃饺子,吃饺子需要酱油和醋。 张三抄起了酱油瓶, 李四抄起了醋瓶。 张三:你先把

    2024年01月25日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包