服务器端针对云服务执行多个请求

时间:2011-04-10 14:56:41

标签: java multithreading asynchronous httpclient server-side

我正在编写一个使用多个Web API的网络应用程序。 对于单个用户的单个请求,我的应用可能需要对其他站点执行多达30个HTTP请求。拥有网络应用程序的网站可以拥有数百个并发用户。

我一直在四处寻找我应该使用哪个库。我正在寻找一个成熟的项目,其中包含详细的文档和经过测试的代码,这些代码将在未来几年内出现。不确定是否存在类似的东西(!)

几个问题:

  1. 在如上所述的情况下,我应该使用异步HTTP客户端(没有线程),还是常规(可能是池)HTTP客户端(带线程)? Asynchronicity减轻了我的应用程序使用线程,但使代码更加分散 - 上面提到的请求数量会不会给我的服务器造成太大负担? (它说here异步更具可扩展性)

  2. 哪个库是常用的?它是Apache HttpComponenets HttpClient还是它的asynch couterpart HttpAsynchClient - 这是在Alpha ......)? jfarcand的AsyncHttpClient怎么样?


  3. 好的,我想说我会使用线程。 在挖掘之后我意识到从servlet中产生线程(在我的例子中 - 一个Struts动作),可能是一个很大的 No No

    相关问题:

    What is recommended way for spawning threads from a servlet in Tomcat

    Need help with java web app design to perform background tasks

    Can i spawn a thread from a servlet ?

    我看到它的方式,这些是我的选择:

    1. use my own thread pool(容器无法管理我的主题)
    2. use a WorkManager such as CommonJ(似乎是非活动产品)
    3. use a 3rd party scheduler such as Quartz(可能是矫枉过正......?)
    4. 对于这个特定用例的任何建议我都很感激 - 聚合来自不同Web服务的lota数据(这个聚合由单个用户的单个请求调用)。

4 个答案:

答案 0 :(得分:1)

好问题。我会首先尝试异步解决方案,看看一切是如何工作的。异步解决方案最容易实现。

如果这不起作用,请尝试更多线程模型。

我会使用HttpClient来发出请求。我已经和它一起工作了很多,并将它用于我必须做的任何http工作。

答案 1 :(得分:0)

每个远程http连接的单个线程,并使用同步http客户端可能会更容易。我会首先尝试这种方法,看看它是否足够快/可扩展。对于同步方法,apache http客户端是一个不错的选择。

如果同步解决方案不够好,netty之类的东西可能不太适合。它使用NIO,因此您不会获得数千个线程。

答案 2 :(得分:0)

我不知道有任何现有的软件可以为你做这些不会过度杀伤的软件。但是你可能会尝试将事情分开。也就是说,分离取出结果显示数据。由于您没有提供有关手头问题的进一步细节,我不能告诉您这是否可行。

基本上,我们的想法是创建一个服务,为您提取这30个后续请求,并在可能的情况下将其处理为请求。此服务的客户端是在Web上运行的服务。它将收到用户的请求,然后将自己的请求发送到您的数据服务。当数据服务准备就绪时,它将返回它的响应。同步或异步。

您可以使用您想要的任何语言(甚至是Java)对您的数据服务进行编程,而不必受到servlet的约束,从而确保获取后续请求并将其组合在响应中并不是由Web服务器完成的。这也可以增强您的Web服务器本身的响应能力。

Nutshell :“困难”任务的分支到专门服务,您可以透明地处理并行性。

答案 3 :(得分:0)

我会使用Jetty并在servlet中使用continuation mechanism来释放线程,同时等待第三方Web请求完成。这将允许服务器上的最大并发性,因为您可以拥有比线程更多的挂起请求。

您可以使用continuation或servlet 3.0异步API,最终结果是相同的。