【所谓服务挂掉】
不知道有没有人跟我有一样的疑问"大量请求涌入为什么会把服务搞挂掉?"
有线程池的存在,不是限制了进程能占用的系统资源么?为什么会挂掉呢?
所以问题就出在,这个挂掉,具体指的是什么意思么?进程的崩溃吗?
答:这里的“挂掉”一般情况下来说,说的还真不是进程挂掉。
以一个单体的 springboot 构建的 hello-world 的 web 程序来进行举例。
min = 200
max = 200
queue-size = Integer.MAX_VALUE
如果一下子涌入上千万个请求,假设网卡之类的不会成为瓶颈,进程也能够维持这么多的连接,那前面的请求就会马上占据线程池里的所有 200 个线程,进行处理,后面的请求进入等待队列。
此时就要注意了,程序的处理速度是有限的,越后面入队的请求的等待时间就会越长,请求的客户端如果是程序的话,就可能会触发客户端的超时重试,进一步加大了服务器的压力(新重新入队等待),如果是人的话,就更可怕了,那个刷新点击来简直太顺手了,虽然服务器一般会有预留空间,服务器的 CPU 可能并不会占满,但是对于客户端来说,这个服务因为排队等待时间过长,几乎处于不可用状态,我理解这就是 “挂掉” 了。
如果因为某个 api 的拥挤,抢占了主要业务的空间,那真更完蛋了。
解决方案:
- 针对 api 限流
- 纵向就是降低单个服务的单次处理时长,横向就是加实例,加机器
版权归原作者 lixifun 所有, 如有侵权,请联系我们删除。