【问题标题】:Server-side performing multiple requests against cloud services服务器端对云服务执行多个请求
【发布时间】:2011-08-02 12:35:35
【问题描述】:

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

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

几个问题:

  1. 在上述情况下,我应该使用异步 HTTP 客户端(无线程)还是常规(可能是池化)HTTP 客户端(有线程)?异步性使我的应用程序不再使用线程,但使代码更加分散——上面提到的请求数量会给我的服务器带来太多负担吗? (它说here 异步更具可扩展性)

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


好的,假设我将使用线程。 在四处挖掘之后,我意识到从 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(可能有点矫枉过正......?)

我将不胜感激针对此特定用例的任何建议 - 聚合来自不同 Web 服务的 lota 数据(此聚合由单个用户的单个请求调用)。

【问题讨论】:

    标签: java multithreading asynchronous httpclient server-side


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 对于数百个用户的 30 个请求,异步是要走的路,否则,如果您在线程上使用同步(阻塞)调用,您将有很多线程阻塞以获得结果。
      • @David,我同意你的看法。我认为从长远来看,异步是要走的路。事实上,在考虑了这个问题之后,我会考虑将远程站点的调用作为持久层/存储的一部分,它可以缓存来自这些外部站点的结果。然后持久层/存储可以根据特定策略更新缓存。我们不知道每个站点需要哪些数据,以及这些数据如何重新散列然后显示在这个特定站点上。也许通过javascript使用来自客户端的异步调用是这里最好的计划。
      【解决方案3】:

      我不知道有任何现有的软件可以为您执行此操作,但不会太过分。但是你可以试着把事情分开。即,将结果显示的数据的提取分开。由于您没有提供有关手头问题的更多详细信息,因此我无法为您说明这是否可行。

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

      您可以使用任何您想要的语言(甚至是 Java)对您的数据服务进行编程,而无需绑定到 servlet,以确保获取后续 30 个请求并将它们组合到响应中不是由网络服务器完成的。这也可以提高您的网络服务器本身的响应能力。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-02-27
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多