使用多个线程提供单个HTTP请求

时间:2017-11-04 00:55:18

标签: java multithreading spring-mvc websphere

Angular 4应用程序将记录列表发送到已部署在Websphere 8 Servlet容器中的Java spring MVC应用程序。然后将列表插入到临时表中。批量插入后,进行过程调用以进行一些计算并返回结果。根据插入到临时表中的列表的大小,可能需要在3000ms(N~500),6000ms(N~1000),50,000 + ms(N> 2000)之间的任何值。

我的asendach是创建数据块并同时将它们发送到数据库进行处理。在线程(期货)返回结果后,我会聚合它们并返回客户端。总而言之,我会将同步调用拆分为多个异步进程(同时执行),并通过启动HTTP调用的同一线程返回客户端 - 登陆到我的控制器。

一切都会好的,如果我的一位经验丰富的同事对此方法没有强烈不同意,我也不会问这个问题。他的理由是,由于线程中断/超时/信号量等原因,使用这种方法很容易出现异常。嗨,据说在Web容器中应该避免多线程,因为它可能会崩溃Servlet容器,以防它用完线程。 他建议我们应该让浏览器发送多个AJAX请求并以块的形式聚合/呈现数据。

你能帮我理解哪种方法更好,为什么?

1 个答案:

答案 0 :(得分:1)

我会说你的方法要好得多。

  1. 应用程序逻辑创建的线程不是应用程序容器线程,仅受操作系统的限制。虽然每个AJAX请求都使用来自应用程序容器的线程。因此,第二种方法降低了吞吐量并增加了达到应用程序容器限制的可能性,而第一种方法则没有。还应该考虑性能,因为创建线程要比通过网络发送请求便宜得多。此外,每个网络请求都使用其他资源进行身份验证/授权/加密等。

  2. 编写正确的多线程代码非常困难,很容易出错。但是它不应该阻止你这样做,因为并发可以显着提高你的性能。使用Future处理中断和超时非常简单,您肯定不需要信号量。

  3. 将此逻辑暴露给客户端就像打破封装一样。想象一下,你使用rest api强制你通过将数据分成块来发送多个请求。我应该使用什么块大小?如何处理超时/中断?我应该发送多少个请求?在这两种方法中你将遇到几乎相同的挑战,但是使用专门为ExecutorService和Future这样的库设计它们会更容易。