Java/Scala multi-threading issue for a web service
在Web服务环境中,我想对应用程序收到的每个请求进行几个独立的http调用。由于这些调用是独立的,因此串行进行调用没有意义,因此我需要某种并发性。
据我了解,为每个http调用不小心创建新线程是没有意义的。而且,重新创建所有这些线程会带来很多开销。
因此,我认为最好的选择是为所有http调用单例创建FixedThreadPool,并在整个应用程序中使用它。
这是最好的选择吗?
- 您是否在使用任何特定的Web服务器?大多数网络服务器都会为您完成此任务。例如,Tomcat已经有一个固定的线程池,并将为每个请求从该池中分配线程。
-
有一个FixedThreadPool(或任何并发util)来进行Http服务调用是一个巨大的过大杀伤力。为什么要为这样的操作执行线程。
-
@ doc_180:我是并发的新手,所以请选择您的替代方法。
-
@rodion:我正在使用Jetty,观察到的是按顺序进行调用。
-
嗯,Tomcat不在客户端分配固定线程池,是吗?我相信他正在尝试创建Rest Client,并希望使用FixedThreadPool进行http调用。如果非常重要,我将使用Spring REST Template之类的框架来实现我的客户端。)
-
就像我提到的,@ Parsa,我可能会考虑使用像Spring rest client这样的框架。我的理解正确吗?您是否正在实施REST客户端?您能证明需要穿线吗?每个呼叫是否同步并阻止您的进程?
-
是的,我确实在实现REST客户端,将其视为一个Web服务,该Web服务从请求中获取2个数字,并且必须调用另一台服务器以检查数字是否为有效的Ints。然后总结一下。因此,有效性检查可以独立进行。现在,它已同步并阻止了该过程。实际上,我更喜欢不使用Spring。
-
@Parsa,我担心使用线程进行http调用。当然,并发util的使用确实消除了一些痛点。当然,您需要编写一个抽象层,以使客户端代码与多线程隔离。这里有一个类似的讨论:stackoverflow.com/questions/2000439/…,或者您可以使用javascript或flex之类的异步技术进行调用。否则,我看不到任何其他选择。 Executors.newFixedThreadPool听起来不错。
您应该认真看一下Akka,尤其是它提供的Camel支持。
您可能要考虑使用AsyncHttpClient AsyncHttpClient库进行非常简单的异步http调用。描述如何使用该库的一系列博客文章正在通过AsyncHttpClient
实现异步