等待WebService调用时使用线程进行其他操作

时间:2018-09-06 09:24:15

标签: java spring rest web-services tomcat

我有一个非常简单的Spring应用程序,该应用程序发布了REST服务(1)。该服务正在调用另一个Web服务(2)来检索数据。检索数据的调用需要2-3秒。

我现在遇到一个问题,会有很多人在呼叫Spring Web服务(1),但是由于每个呼叫都必须等待第二个呼叫完成,因此响应时间急剧增加。

我目前的理解是,每个未直接处理的呼叫都将进入队列。我有四个CPU,每个CPU有2个线程,同时有8个工作线程。

在等待服务调用(2)完成时,是否有任何方法可以释放线程?

1 个答案:

答案 0 :(得分:2)

处理此问题的通常方法是拥有比CPU多的线程,并依靠线程调度程序在线程之间进行切换。

例如,...假设有2个内核和3个或更多线程

  1. 服务器接受请求R1并开始在核心C1上运行的线程T1上处理它。
  2. 服务器接受请求R2并开始在核心C2上运行的线程T2上处理它。
  3. 服务器接受请求R3并将其分派到线程T3。 T3目前无法运行(没有可用的内核),因此它等待排定。
  4. T1到达将请求发送到其他服务的位置。发送请求,T1阻塞等待答复。这将释放核心C1。
  5. T3计划在C1上运行,请求R3的处理正在进行中。

基本上,阻塞,取消阻塞和调度都是由Java和OS在后台处理的。而且,如果您使用的是Servlet,则该容器将处理工作线程池和对线程的请求分配。

这对于多达一百个左右的 1 线程工作正常;即一百个左右的请求被同时处理。除此之外,过多的线程(例如线程堆栈内存)和过多的调度/上下文切换开销会影响吞吐量。那时,您需要研究一个支持异步处理 2 的框架,其中线程在请求​​之间进行切换而不是阻塞。


1-线程过多会影响性能的点将取决于各种难以预测的因素。

2-Servlet 3.0规范支持异步请求处理,因此,如果需要,请寻找一个支持Servlet 3.0的Web容器。例如Tomcat 7或更高版本。