是否存在基于异步I / O的Aws Java客户端?

时间:2012-02-12 18:42:39

标签: java amazon-web-services jetty

1)是否有aws sdk的实现使用异步I / O而不是线程池?我正在开发一个高度可扩展的Web服务,并且分析显示CPU正在浪费大量循环来管理来自amazon的网络I / O.

2)当前客户端使用Apache Http Client,如果我找不到异步实现,我将分叉我自己的版本来实现它。我在考虑使用Jetty Http Client。混合Jetty和Apache库是不好的形式?还有更好的选择吗?

3 个答案:

答案 0 :(得分:7)

  

1)是否存在使用异步的aws sdk的实现   I / O而不是线程池?

不是我知道的,如果它已经存在,我会很难找到它。

  

2)当前客户端使用Apache Http Client,如果我找不到的话   asynch实现我将分叉我自己的版本来实现它。 [...]有没有更好的   替代?

确实有一个更好的选择 - AWS SDK for Java目前使用来自Http ClientApache HttpComponents版本4.x(您链接到遗留3.1版JavaDocs),它可以方便地提供Async HttpClient也是:

  

Async HttpClient是HTTP / 1.1兼容的HTTP代理实现   基于HttpCore NIO 和HttpClient组件。这是一种补充   模块到Apache HttpClient 用于特殊情况下的能力   处理大量并发连接更为重要   而不是性能就原始数据吞吐量而言。 [强调我的]

正如所强调的那样,只应为各个用例提供便利,但是(根据your comment)你是向AW发送数千个请求,这意味着开放请求倾向于堆积 ,这可能确实有帮助。

答案 1 :(得分:2)

异步IO不是银弹 - 每个连接的线程通常更快(吞吐量方面)并且更容易编码:

http://www.mailinator.com/tymaPaulMultithreaded.pdf

在我看来,你的限制因素是亚马逊的IO,而不是所有这些连接的CPU处理。您看到轮询套接字所花费的大量CPU时间的事实可能只是一个分析工件,因为这些调用会阻塞。 (需要检查一下:你实际上是在大量使用CPU吗?)

答案 2 :(得分:2)

2017年6月新的 AWS SDK for Java 2.0预览announced并提供此功能。

  

SDK现在支持真正的非阻塞I / O. 1.11.x版本的SDK已经具有服务客户端的异步变体。但是,它们只是线程池和阻塞同步客户端的包装器,因此它们不提供非阻塞I / O(具有极少线程的高并发性)的好处。由于每个连接线程模型的限制和资源使用不足,许多客户请求支持非阻塞I / O,因此我们很高兴地宣布对异步客户端中的非阻塞I / O提供一流的支持。在幕后,我们使用构建在Netty之上的HTTP客户端来进行非阻塞HTTP调用。

有关详细信息,请参阅

但是,请注意:

  • 目前处于预览状态(不推荐用于生产用途)
  • 需要Java 8 +

更新(2019年1月)

当前版本为2.3.0(预览很长时间)。

建议在基于maven的项目中使用此BOM:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>bom</artifactId>
      <version>2.3.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>