概述
前不久,由于组内一个同事滥用线程池造成了一起比较严重的线上故障。现在记录一下,防止自己以后犯同样的错误。
A接口是用来返回所有类型的光线数据的同步接口。某种特定的光线x3用了一个线程池(线程池里面有两个线程,将一个任务拆成两个来同时进行,等两个线程的任务完成后合并数据并返回),来加快光线x3的生成速度。光线x3的qps不是很大, 但是A接口的qps比较大。然后将用于生成光线x3的线程池,应用到了整个A接口上,造成了服务器雪崩。
我们知道每个请求会有一个线程来处理,现在所有请求接口A的线程执行生成光线逻辑的时候都会用到这个线程池,如果前一个请求还没有处理完(这个请求可能是一个比较复杂的请求, 耗时可能会比其他请求多很多)还在用线程池的话, 后面的线程只能等待,并发量大的话,任务消化不了,将会堆积越来越多的线程等待。请求服务接口的线程也是放在线程池里面的, 如果线程用光了,其他调用服务的消费者不光不能使用A接口,其他所有的接口也可能用不了。
如果接口A没有用到线程池,执行接口A逻辑的线程都有可能被分到时间片来执行任务(虽然某些请求返回比较慢,但不会卡住其他请求),也就不会这么容易就造成雪崩。
总结:在并发量大的情况下,不要试图使用线程池来加快单个请求的速度。
最后
以上就是开放鞋垫为你收集整理的滥用线程池引发的问题的全部内容,希望文章能够帮你解决滥用线程池引发的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复