2017-11-04 101 views
0

Angular 4应用程序向已部署在Websphere 8 Servlet容器中的Java spring MVC应用程序发送记录列表。该列表然后插入到临时表中。批量插入后,会进行过程调用以执行一些计算并返回结果。根据插入临时表的列表大小,可能需要3000毫秒(N〜500),6000毫秒(N〜1000),50,000毫秒(N> 2000)之间的任意值。为多个线程提供单个HTTP请求

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

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

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

+0

听起来更简单,发送并行请求,然后编写一堆服务器端代码,但不是因为将工作从servlet卸载到多个线程中存在任何固有问题。 – covener

+0

在这种情况下,客户端不仅要处理呈现数据,还要聚合。不会在客户端增加更多的开销吗? 我已经编写了服务器端代码(未经测试),但准备抛弃它,如果不是这样做的话...... – gumenimeda

+0

我不认为这两种方法都是客观对错或错误 – covener

回答

1

我会说你的方法好得多。

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

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

  3. 将此逻辑暴露给客户端看起来像破坏封装。想象一下,你使用rest api,它迫使你发送多个请求,通过分割你的数据。我应该使用哪些块大小?如何处理超时/中断?我应该发送多少个请求?在这两种方法中您都会遇到同样的挑战,但使用为ExecutorService和Future等库专门设计的应用程序要容易得多。