我有一个非常简单的Spring应用程序,该应用程序发布了REST服务(1)。该服务正在调用另一个Web服务(2)来检索数据。检索数据的调用需要2-3秒。
我现在遇到一个问题,会有很多人在呼叫Spring Web服务(1),但是由于每个呼叫都必须等待第二个呼叫完成,因此响应时间急剧增加。
我目前的理解是,每个未直接处理的呼叫都将进入队列。我有四个CPU,每个CPU有2个线程,同时有8个工作线程。
在等待服务调用(2)完成时,是否有任何方法可以释放线程?
答案 0 :(得分:2)
处理此问题的通常方法是拥有比CPU多的线程,并依靠线程调度程序在线程之间进行切换。
例如,...假设有2个内核和3个或更多线程
基本上,阻塞,取消阻塞和调度都是由Java和OS在后台处理的。而且,如果您使用的是Servlet,则该容器将处理工作线程池和对线程的请求分配。
这对于多达一百个左右的 1 线程工作正常;即一百个左右的请求被同时处理。除此之外,过多的线程(例如线程堆栈内存)和过多的调度/上下文切换开销会影响吞吐量。那时,您需要研究一个支持异步处理 2 的框架,其中线程在请求之间进行切换而不是阻塞。
1-线程过多会影响性能的点将取决于各种难以预测的因素。
2-Servlet 3.0规范支持异步请求处理,因此,如果需要,请寻找一个支持Servlet 3.0的Web容器。例如Tomcat 7或更高版本。