1)是否有aws sdk的实现使用异步I / O而不是线程池?我正在开发一个高度可扩展的Web服务,并且分析显示CPU正在浪费大量循环来管理来自amazon的网络I / O.
2)当前客户端使用Apache Http Client,如果我找不到异步实现,我将分叉我自己的版本来实现它。我在考虑使用Jetty Http Client。混合Jetty和Apache库是不好的形式?还有更好的选择吗?
答案 0 :(得分:7)
1)是否存在使用异步的aws sdk的实现 I / O而不是线程池?
不是我知道的,如果它已经存在,我会很难找到它。
2)当前客户端使用Apache Http Client,如果我找不到的话 asynch实现我将分叉我自己的版本来实现它。 [...]有没有更好的 替代?
确实有一个更好的选择 - AWS SDK for Java目前使用来自Http Client的Apache 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调用。
有关详细信息,请参阅
但是,请注意:
更新(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>