2012-02-12 64 views
8

1)是否有它使用的線程池的異步I/O,而不是aws sdk的實現?我正在研究一個高度可擴展的Web服務和分析表明,CPU正在浪費很多週期來管理來自亞馬遜的網絡I/O。有沒有基於異步I/O的Aws java客戶端?

2)目前的客戶端使用Apache Http Client,如果我不能找到一個非同步執行我將叉我自己的版本來實現它。我正在考慮使用Jetty Http Client。混合Jetty和Apache庫是不是很糟糕?有更好的選擇嗎?

+1

_ 「CPU瓶頸是亞馬遜的所有連接」 _不,這是一個(網絡)I/O瓶頸。根據定義,CPU的瓶頸是**。 – 2012-02-12 18:44:16

+2

你是對的網絡是瓶頸,但我不想浪費CPU網絡I/O上的CPU時間和線程。 hprof報告顯示,大部分cpu樣本都在輪詢插座時發生。 – 2012-02-12 18:47:55

+2

區別在於你希望獲得什麼。異步I/O無法爲您節省服務延遲:它不會讓AWS在您的請求中更快地處理您的請求。但是,它可能讓您在等待時進行更有意義的本地計算。爲此,線程池也是如此。 – phs 2012-02-12 18:51:36

回答

7

1)是否有aws sdk的實現,它使用異步 I/O而不是線程池?

不是我所知道的,我很驚訝這很難找到,如果它已經存在。

2)目前的客戶端使用Apache的HTTP客戶端,如果我不能找到一個 非同步執行我將叉我自己的版本來實現它。 [...]有沒有更好的 替代方案?

確實是有一個更好的選擇 - 在AWS SDK for Java目前使用從Apache HttpComponentsHttp Client 4.x版本(你鏈接到舊版本3.1的JavaDoc代替),它方便地提供Async HttpClient還有:

Async HttpClient是一個HTTP/1.1兼容HTTP代理實現 基於的HttpCore NIO和HttpClient的組件。它是針對Apache HttpClient 的互補 模塊,旨在用於處理大量併發連接的能力 在原始數據吞吐量方面比性能更重要的特殊情況 。 [重點煤礦]

所強調的那樣,它應該只對相應的便利使用的情況,但是這意味着(每your comment爲)你是發送成千上萬的請求到AWS打開請求往往會堆積起來 ,所以這可能確實有幫助。

+2

最後有人回答了提問。謝謝 – 2012-02-12 19:34:28

2

異步IO是不是銀彈 - 線程每個連接通常更快(吞吐量明智)和一個更容易代碼:

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

這聽起來我喜歡你的限制因素是IO到Amazon,而不是所有這些連接的CPU處理。事實上,您看到花費在查詢套接字上的大量CPU時間可能只是一個分析工件,因爲這些調用會被阻塞。 (需要檢查的是:您是否確實最大限度地利用CPU使用?)

0

新的AWS SDK for Java 2.0預覽在2017年6月爲announced並提供此功能。

的SDK現在支持真正的非阻塞I/O。 1.11。x版本的SDK已經具有服務客戶端的異步變體。但是,它們只是線程池和阻塞同步客戶端的包裝,因此它們不提供非阻塞I/O的優點(很少線程的高併發)。由於每個連接線程模型的限制和資源使用不足,許多客戶要求支持非阻塞I/O,因此我們很高興宣佈我們的異步客戶端支持非阻塞I/O。在引擎蓋下,我們使用建立在Netty之上的HTTP客戶端來進行非阻塞HTTP調用。

欲瞭解更多信息,請參閱

但是,要知道:

  • 目前在預覽(不推薦用於生產用途還)
  • 需要Java 8+