AWS SDK for Java 2.x のベストプラクティス - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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 設定セットが用意されています。お客様には、ユースケースに基づいてアプリケーションの HTTP 構成を調整することをお勧めします。

手始めに、SDK にはスマート設定のデフォルト機能が用意されています。この機能は、バージョン 2.17.102 で始めることで使用できます。ユースケースに応じて、適切な設定値が得られるモードを選択します。

Netty ベースの HTTP クライアントに OpenSSL を使用

デフォルトでは、SDK の NettyNioAsyncHttpClient は JDK のデフォルトの SSL 実装を 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#apiCallAttemptTimeoutClientOverrideConfiguration#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 を分析することをお勧めします。