使用异步http增强吞吐量

时间:2015-11-18 08:19:20

标签: java multithreading http asynchronous

在java web-app中,我想根据以下要求最大化我的服务器吞吐量:

  • 获取多个并发http请求的系统。
  • 对于每个请求,都需要进行一些处理。
  • 每个请求处理都包含几个步骤。
  • 最后一步调用外部API(http调用)。

这是描述我的系统的基本图表:

enter image description here

因此对于每个请求我都是:

  • 创建3个可运行并提交(使用我的执行程序)。
  • 然后我等待所有3个完成并继续处理结果(使用Guava ListenableFuture进行)
  • 处理完所有返回响应的结果后

在这个设计中,我使用的是同步http客户端(在调用外部服务时),这意味着我的每个任务在进入第3步后都会被阻止,直到http响应返回。这可能需要几百毫秒。

我的问题是 - 我想知道使用异步http客户端是否可以帮助我提高吞吐量?使用异步http客户端,一旦我启动我的http请求,任务的线程就会被释放回池中并可用于其他处理,一旦http响应返回,就会分配一个新线程来继续执行任务。是否有意义?如果是这样,它是否取决于http外部调用完成所需的时间?如果响应在5ms后返回,我仍然可以获得额外的吞吐量吗?有人测量过类似的东西吗?

1 个答案:

答案 0 :(得分:1)

假设异步客户端不是指Servlet异步上下文,而是支持Futures或Callbacks的HTTP客户端实现,使用异步http客户端不会带来任何好处。

因为您仍需要等待负责请求处理的容器线程中的HTTP客户端返回的Future。但是,如果您选择使用回调,我不确定该回调将如何重新启动容器线程以返回响应。 似乎使用回调执行此操作的正确方法是使用Servlet 3异步功能。

通过使用Servlet异步,您将能够节省容器线程的时间,并能够在相同的时间内处理更多的请求。同样在这种情况下,不需要使用异步HTTP客户端,因为HTTP API调用已经在Servlet异步线程中。

如果响应(HTTP API调用)在5ms内恢复,则不太可能获得吞吐量。也就是说我没有为此做过任何基准测试,看到这样的基准测试结果会很有意思。