事情起因是这样的,新来的开发小弟在controller写了一个阻塞的请求,而且直接用了while(true),抛异常时里面的跳出条件永远不满足。(当然提交代码时被我们发现了)
于是我们就研究起了他会怎样影响程序。
首先我们的理论知识是,tomcat在接收到请求时,会从线程池里拿一个空闲线程去处理这个请求,所以死循环只限于当前线程,当再发起一个请求时,也会是新线程,所以请求会没响应,但是不会导致程序直接挂掉(tomcat最大能匀出200个线程还hold住自己测试的少量请求)。
于是我打开两个浏览器tab页面同时发一样的请求时,查看控制台显示。
文章图片
线程确实是不一样的,但是为啥请求时间差了20多秒?
一开始我以为理论知识出问题了,后来又想了一会儿,新开一个浏览器再来一次。
一个请求用edge发,一个请求用chrome发,这时两个请求时间间隔就是按回车的时间差了。
所以浏览器内部一定有什么机制阻止了多个tab页面对同一个url发请求的情况(阻塞的)。
查了下资料,上面有解决方案。
1.只要把浏览器的缓存禁用,就会发现不存在串行化的问题上面的逻辑也有一些漏洞,实际上应该是有个超时时间,在超时时间内,会阻塞,超过了超时时间,才会发起新请求。
这时多次请求是同时发起的,5s后同时结束
2.如果浏览器的缓存不禁用
浏览器是期望相同的URL服务器返回304的响应,但可惜的是第一次响应内容没有缓存,因此每次请求都是串行,执行顺序是 5s+5s+5s
但如果浏览器发送了cache响应,那么
第一次执行5s,之后均为缓存 那么执行顺序是是 5s +0 +0
总结,这个功能其实是给网页上的图片准备的
在edge下打开开发者页面,点设置
【当浏览器多个tab发一样的请求的时候】
文章图片
于是我试了下,打开3个tab并同时打开开发者页面,后端确实可以直接响应了。
所以这个现象的原因是浏览器会缓存大文件/图片,提高加载速度。
查到的资料原地址,看着也像是翻译的页面。
浏览器多tab打开同一URL串行化的问题 - 风雪之隅 (laruence.com)