翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS SDK for Java 2.x のベストプラクティス
このセクションでは、SDK for Java 2.x を使用する際のベストプラクティスについて説明します。
トピック
可能なかぎり SDK クライアントを再利用する
各 SDK クライアントは独自の HTTP 接続プールを維持します。プールにすでに存在する接続を新しいリクエストで再利用できるため、新しい接続を確立する時間を短縮できます。効果的に使用されていない接続プールが多すぎることによるオーバーヘッドを避けるため、クライアントの 1 つのインスタンスを共有することをおすすめします。SDK クライアントはすべてスレッドセーフです。
クライアントインスタンスを共有したくない場合は、クライアントが必要ないときにインスタンスで close()
を呼び出してリソースを解放してください。
クライアントオペレーションからの入力ストリームを閉じます。
S3Client#getObject
などのストリーミング操作では、ResponseInputStream
を直接操作する場合は、次を実行することをお勧めします。
-
できるだけ早く入力ストリームからすべてのデータを読み取ります。
-
できるだけ早く入力ストリームを閉じます。
このような推奨を行うのは、入力ストリームは HTTP 接続からのデータの直接ストリームであり、ストリームからのデータがすべて読み取られてストリームが閉じられるまで、基盤となる HTTP 接続を再利用できないためです。これらのルールに従わないと、開いているが未使用の HTTP 接続を大量に割り当てて、クライアントがリソースを使い果たす可能性があります。
パフォーマンステストに基づいて HTTP 構成を調整します。
SDK には、一般的なユースケースに適用されるデフォルト HTTP 設定
手始めに、SDK にはスマート設定のデフォルト機能が用意されています。この機能は、バージョン 2.17.102 で始めることで使用できます。ユースケースに応じて、適切な設定値が得られるモードを選択します。
Netty ベースの HTTP クライアントに OpenSSL を使用
デフォルトでは、SDK の NettyNioAsyncHttpClient
SslProvider
として使用します。テストの結果、OpenSSL は JDK のデフォルト実装よりもパフォーマンスが優れていることがわかりました。Netty コミュニティでは OpenSSL の使用も推奨しています
OpenSSL を使用するには、依存関係に netty-tcnative
を追加します。設定の詳細については、「Netty プロジェクトのドキュメント
プロジェクト用に netty-tcnative
を設定すると、NettyNioAsyncHttpClient
インスタンスは自動的に OpenSSL を選択します。または、次のスニペットに示すように、NettyNioAsyncHttpClient
ビルダーを使用して明示的に SslProvider
を設定することもできます。
NettyNioAsyncHttpClient.builder() .sslProvider(SslProvider.OPENSSL) .build();
API タイムアウトの設定
SDK は、接続タイムアウトやソケットタイムアウトなど、一部のタイムアウトオプションにはデフォルト値を提供しますが、API コールタイムアウトや個々の API コール試行タイムアウトにはデフォルト値
ClientOverrideConfiguration#apiCallAttemptTimeout
と ClientOverrideConfiguration#apiCallTimeout
を使用して、サービスクライアントが行うすべてのリクエストにタイムアウトを設定できます。
次の例は、カスタムタイムアウト値を使用する Amazon S3 クライアントの設定を示しています。
S3Client.builder() .overrideConfiguration( b -> b.apiCallTimeout(Duration.ofSeconds(
<custom value>
)) .apiCallAttemptTimeout(Duration.ofMillis(<custom value>
))) .build();
apiCallAttemptTimeout
-
この設定では、1 回の HTTP 試行にかかる時間を設定します。この時間が経過すると API コールを再試行できます。
apiCallTimeout
-
このプロパティの値は、すべての再試行を含む実行全体の時間を設定します。
サービスクライアントでこれらのタイムアウト値を設定する代わりに、RequestOverrideConfiguration#apiCallTimeout()
RequestOverrideConfiguration#apiCallAttemptTimeout()
を使用して 1 つのリクエストを設定できます。
次の例では、カスタムタイムアウト値を使用して 1 つの listBuckets
リクエストを設定します。
s3Client.listBuckets(lbr -> lbr.overrideConfiguration( b -> b.apiCallTimeout(Duration.ofSeconds(
<custom value>
)) .apiCallAttemptTimeout(Duration.ofMillis(<custom value>
))));
これらのプロパティを一緒に使用すると、すべての再試行に費やされる合計時間にハードリミットを設定します。また、低速なリクエストに対して、フェイルファストするよう、個々の HTTP リクエストを設定することもできます。
メトリクスを使用
SDK for Java は、アプリケーションのサービスクライアントのメトリクスを収集できます。これらのメトリクスを使用して、パフォーマンスの問題を特定したり、全体的な使用傾向を確認したり、返されたサービスクライアントの例外を確認したり、特定の問題を掘り下げて理解したりすることができます。
アプリケーションのパフォーマンスをより深く理解するために、メトリクスを収集して Amazon CloudWatch Logs を分析することをお勧めします。