2012-02-12 9 views
8

1)スレッドプールの代わりに非同期I/Oを使用するaws sdkの実装はありますか?高度にスケーラブルなWebサービスを研究しており、プロファイリングは、CPUがamazonとの間でネットワーク入出力を管理するサイクルを無駄にしていることを示しています。非同期I/OベースのAws Javaクライアントはありますか?

2)現在のクライアントではApache Http Clientが使用されています。非同期実装が見つからない場合は、独自のバージョンを実装して実装します。私はJetty Http Clientを使用することを考えていました。 JettyとApacheライブラリを混在させるのは悪い方法ですか?よりよい選択肢がありますか?

+1

ニーズ_ "CPUボトルネックは、Amazonへのすべての接続である" _いいえ、それは(ネットワーク)I'S/Oボトルネック。 CPUのボトルネックは、定義上は**、CPUは**です。 –

+2

あなたはネットワークがボトルネックですが、そのネットワークI/O上でCPU時間とスレッドを浪費したくありません。 hprofレポートは、CPUのサンプルの大部分がソケットをポーリングする際に発生することを示しています。 –

+2

違いはあなたが得たいものです。非同期I/Oはサービスの待ち時間からあなたを救うことはできません。AWSの要求処理は魔法のように早く終わらせることはありません。しかし、あなたが待っている間に、より意味のあるローカル計算を行うことができます。それはスレッドプールなのです。 – phs

答えて

7

1)スレッドプールの代わりに非同期 I/Oを使用するaws sdkの実装はありますか?

私が知っているわけではありませんが、すでに存在するならば、これを見つけるのは驚きです。

2)現在のクライアントはApache Http Clientを使用していますが、 の非同期実装が見つからない場合は、独自のバージョンを実装して実装します。 [...]よりよい がありますか?

確かに、より良い選択肢があります - AWS SDK for Javaは現在、便利なだけでなくAsync HttpClientを提供Apache HttpComponentsからHttp Clientバージョン4.x(あなたの代わりにレガシー3.1バージョンのJavaDocにリンクされている)、使用しています:

Async HttpClientは、HttpCore NIOとHttpClientコンポーネントに基づくHTTP/1.1準拠のHTTPエージェント実装 です。 Apache HttpClientへの モジュールは、 が多数の同時接続を処理する能力がより重要である特別な場合を想定しています。 生データスループットに関しては、のパフォーマンスよりも重要です。 [重点鉱山]

強調し、それが唯一のそれぞれのために促進されるように例を使用していますが、(your commentあたりのように)あなたは、オープン要求がを積み上げる傾向にあることを意味しているAWSへのリクエストの数千人を送信していますですから、これは本当に助けになるかもしれません。

+2

最後に誰かが質問に答えました。ありがとう –

2

非同期IOは銀の弾丸ではありません - スレッドごとの接続は、通常は高速です(スループットワイズ)とのコードに簡単にたくさん:あなたの制限要因があるよう

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

それは私に聞こえますAmazonからIOへのすべての接続のCPU処理ではありません。ソケットをポーリングするのに費やされるCPU時間の多くを見ているという事実は、それらの呼び出しがブロックされているため、プロファイリングの成果物にすぎないかもしれません。

0

新しいAWS SDK for Java 2.0のプレビューは、2017年6月のannouncedであり、この機能を提供しています(確認の対象は実際にはCPU使用率ですか?

SDKは真にノンブロッキングI/Oをサポートするようになりました。 1.11。xバージョンのSDKにはすでにサービスクライアントの非同期型があります。しかし、それらはスレッドプールとブロッキング同期クライアントのラッパーに過ぎないため、非ブロッキングI/O(非常に少ないスレッドで高い並行性)の利点はありません。接続ごとのスレッドモデルの制限とリソースの不足により、非ブロッキングI/Oのサポートが要求された顧客が多いため、非同期クライアントで非ブロッキングI/Oのファーストクラスサポートを発表することができました。実際には、Nettyの上に構築されたHTTPクライアントを使用して、非ブロッキングHTTP呼び出しを行います。詳細については

、しかし、注意して

を参照してください。

  • は、現在プレビューで(まだ本番環境での使用は推奨されません)
  • のJava 8+
関連する問題