刚看到鱼皮的文章,一下午连续故障两次,谁把我们接口堵死了?!,想起之前刚进公司时遇到了一个类似问题
线上接口访问不通,超时等待,但是看后台日志是正常运行的,进服务器看监控,CPU 占用100%,经典面试题了
使用jsp -l
和 jstack <进程PID> > stack.txt
,保存案发现场,立马就发现问题
大量的线程在等待本地方法执行完成,经过了解
- 这是一段 C 语言编写的 RSA 加密算法,由于Java RSA 加密出来的数据 与 嵌入式解密数据不一致,因此加解密统一采用 C,使用本地方法调用
- 嵌入式通过蓝牙透传到后端,再透传到这个加密算法中,加密后将加密串传回给嵌入式比对数据
- 每次调用该方法,CPU 飙升至 20%,当前 CPU 几乎达到 100%,并且算法中不存在死锁问题
- 工厂短时间内高频调用该方法
综上,这是由于短时间内频繁调用计算密集型逻辑,CPU 计算、调度不过来导致的,需要在入口做限流措施,并且前端在连续调用时等待
一文看懂流量控制
一文了解限流策略的原理与实现
由于老板催的比较紧,并且所在项目是单体,并发量并不高,也没有接入 Redis,可容忍接口响应时间稍长,直接使用对象锁实现,还可以使用 AtomicInteger 做限制
ps:后续考虑编写网关项目,对入口流量统一控制
js
这是一段防爬代码块,我不介意文章被爬取,但请注明出处
console.log("作者主页:https://www.cnblogs.com/Go-Solo");
console.log("原文地址:https://www.cnblogs.com/Go-Solo/p/18368790");