线上问题排查——接口长时间未响应

刚看到鱼皮的文章,一下午连续故障两次,谁把我们接口堵死了?!,想起之前刚进公司时遇到了一个类似问题

线上接口访问不通,超时等待,但是看后台日志是正常运行的,进服务器看监控,CPU 占用100%,经典面试题了

使用jsp -ljstack <进程PID> > stack.txt,保存案发现场,立马就发现问题

大量的线程在等待本地方法执行完成,经过了解

  1. 这是一段 C 语言编写的 RSA 加密算法,由于Java RSA 加密出来的数据 与 嵌入式解密数据不一致,因此加解密统一采用 C,使用本地方法调用
  2. 嵌入式通过蓝牙透传到后端,再透传到这个加密算法中,加密后将加密串传回给嵌入式比对数据
  3. 每次调用该方法,CPU 飙升至 20%,当前 CPU 几乎达到 100%,并且算法中不存在死锁问题
  4. 工厂短时间内高频调用该方法

综上,这是由于短时间内频繁调用计算密集型逻辑,CPU 计算、调度不过来导致的,需要在入口做限流措施,并且前端在连续调用时等待
一文看懂流量控制
一文了解限流策略的原理与实现

由于老板催的比较紧,并且所在项目是单体,并发量并不高,也没有接入 Redis,可容忍接口响应时间稍长,直接使用对象锁实现,还可以使用 AtomicInteger 做限制

ps:后续考虑编写网关项目,对入口流量统一控制

js 复制代码
这是一段防爬代码块,我不介意文章被爬取,但请注明出处
console.log("作者主页:https://www.cnblogs.com/Go-Solo");
console.log("原文地址:https://www.cnblogs.com/Go-Solo/p/18368790");