2011-04-10 144 views
2

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

我一直在四处寻找试图找出我应该使用哪个库。我正在寻找一个具有详细文档和测试代码的成熟项目,这个项目将在未来几年内完成。如果这样的事情存在,不知道

几个问题(!):

  1. 的情况下,如上述,我应该使用异步HTTP客户端(不穿),或常规(可能合并)HTTP客户端(带线程)?异步性使我的应用程序免于使用线程,但使代码更加分散 - 上述请求数量会给我的服务器造成太多负担吗? (它说here异步更具扩展性)

  2. 哪个库是常用的?它是Apache HttpComponenets HttpClient还是它的异步线程HttpAsynchClient - 这是在阿尔法...)? jfarcand的AsyncHttpClient怎么样?


好吧,让我们说,我将使用线程。 周围挖后,我认识到,一个servlet中产卵的线程(在我的情况 - 一个Struts动作),可能是一个大否否

相关的问题:

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 ?

的方式I S ee值它,这是我的选择:(?可能是矫枉过正...)

  1. use my own thread pool(容器不管理自己的线程)
  2. use a WorkManager such as CommonJ(似乎是一个无效产品)
  3. use a 3rd party scheduler such as Quartz

我将不胜感激的任何建议为这一特定使用案例 - 聚合来自不同的Web服务lotsa数据(这种聚集是由单个用户的单个请求调用)。

回答

1

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

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

我会使用HttpClient进行请求。我已经使用了它很多,并将其用于我必须做的任何http工作。

+0

在数以百计的用户发出30个请求时,异步就是要走的路,否则如果在线程上使用同步(阻塞)调用,则会有很多线程阻塞结果。 – 2011-04-19 17:42:51

+0

@大卫,我同意你的意见。我认为从长远来看,异步是最好的选择。事实上,在对这个问题进行了一些思考之后,我会考虑将对远程站点的调用作为可以缓存来自这些外部站点的结果的持久层/存储的一部分。然后,持久层/存储可以基于特定策略来更新缓存。我们不知道每个网站需要哪些数据,以及这些数据如何重新整理并显示在特定网站上。也许通过javascript使用来自客户端的异步调用是最好的计划。 – hooknc 2011-04-19 18:07:56

0

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

如果同步解决方案不够好,像netty之类的东西可能会非常合适。它使用NIO,所以你不会得到数千个线程。

0

我不知道任何现有的软件为你做这不会矫枉过正。但是你可以尝试分解事情。也就是说,分开获取结果显示的数据。既然你没有提供关于手头问题的进一步细节,我不能说你是否可行。

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

您可以用任何您想要的语言(甚至是Java)来编程您的数据服务,而不必绑定到servlet,以确保获取后续请求并将它们组合在响应中不会由Web服务器完成。这也可以增强您的Web服务器本身的响应能力。

果壳:的``难”的任务分支专门的服务,您可以透明地处理并行

0

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

你可以使用continuations或servlet 3.0异步API,结束结果是一样的。