AWS SDK for Java 2.x での HTTP クライアントの設定
AWS SDK for Java 2.x で、サービスクライアントに使用する HTTP クライアントを変更するとともに、HTTP クライアントのデフォルト設定を変更できます。このセクションでは、HTTP クライアントおよび SDK を設定する方法について説明します。
Java の SDK で使用可能な HTTP クライアント
同期クライアント
SDK for Java の同期 HTTP クライアントは SdkHttpClientS3Client や DynamoDbClient などの同期サービスクライアントでは、同期 HTTP クライアントを使用する必要があります。AWS SDK for Java には 3 つの同期 HTTP クライアントがあります。
- ApacheHttpClient (デフォルト)
-
ApacheHttpClient
は、同期サービスクライアントのデフォルトの HTTP クライアントです。 ApacheHttpClientの設定の詳細については、「Apache ベースの HTTP クライアントの設定」を参照してください。 - AwsCrtHttpClient
-
AwsCrtHttpClient
は、高いスループットとノンブロッキング IO を提供します。このクライアントは、AWS 共通ランタイム (CRT) Http クライアント上に構築されています。 AwsCrtHttpClientの設定と、サービスクライアントと一緒に使用する方法については、「AWS CRT ベースの HTTP クライアントを設定する」を参照してください。 - UrlConnectionHttpClient
-
アプリケーションが使用する jar とサードパーティライブラリの数を最小限に抑えるには、UrlConnectionHttpClient
を使用できます。 UrlConnectionHttpClientの設定の詳細については、「URLConnection ベースの HTTP クライアントを設定する」を参照してください。
非同期クライアント
SDK for Java の非同期 HTTP クライアントは SdkAsyncHttpClientS3AsyncClient や DynamoDbAsyncClient などの非同期サービスクライアントでは、非同期 HTTP クライアントを使用する必要があります。AWS SDK for Java には 2 つの非同期 HTTP クライアントがあります。
- NettyNioAsyncHttpClient (デフォルト)
-
NettyNIOAsyncHttpClient
は、非同期クライアントが使用するデフォルトの HTTP クライアントです。 NettyNioAsyncHttpClientの設定の詳細については、「Netty ベースの HTTP クライアントの設定」を参照してください。 - AwsCrtAsyncHttpClient
-
AwsCrtAsyncHttpClient
は AWS 共通ランタイム (CRT) HTTP クライアントに基づいています。 AwsCrtAsyncHttpClientの設定の詳細については、「AWS CRT ベースの HTTP クライアントを設定する」を参照してください。
HTTP クライアントの推奨事項
HTTP クライアントの実装を選択するには、いくつかの要因が関係します。決定には以下の情報を参考にしてください。
推奨事項フローチャート
以下のフローチャートは、どの HTTP クライアントを使用するかを判断するのに役立つ一般的なガイダンスを示しています。
HTTP クライアントの比較
以下の表は、各 HTTP クライアントの詳細情報を示しています。
| HTTP クライアント | 同期または非同期 | どのようなときに使うか | 制限/欠点 |
|---|---|---|---|
| Apache ベースの HTTP クライアント (デフォルトの同期 HTTP クライアント) |
同期 | 高スループットよりも低レイテンシーを好む場合に使用します | 他の HTTP クライアントと比較して起動時間が遅い |
| URLConnection ベースの HTTP クライアント | 同期 | サードパーティの依存関係を制限するという厳しい要件がある場合に使用します | Amazon ApiGateway の更新オペレーションなど一部の API で必要な HTTP PATCH メソッドはサポートしていません |
| AWS CRT ベースの同期 HTTP クライアント 1 | 同期 |
• アプリケーションが AWS Lambda で実行されている場合に使用します • 低レイテンシーよりも高スループットを好む場合に使用します • 同期 SDK クライアントを好む場合に使用します |
以下の Java システムプロパティはサポートされなくなりました。
|
| Netty ベースの HTTP クライアント (デフォルトの非同期 HTTP クライアント) |
非同期 |
• アプリケーションが Kinesis API SubscribeToShard などの HTTP/2 サポートを必要とする API を呼び出す場合に使用します |
他の HTTP クライアントと比較して起動時間が遅い |
| AWS CRT ベースの非同期 HTTP クライアント 1 | 非同期 | • アプリケーションが AWS Lambda で実行されている場合に使用します • 低レイテンシーよりも高スループットを好む場合に使用します • 非同期 SDK クライアントを好む場合に使用します |
• 以下の Java システムプロパティはサポートされなくなりました。
|
1追加の利点があるため、可能であれば AWS CRT ベースの HTTP クライアントを使用することをお勧めします。
スマート設定のデフォルト
AWS SDK for Java 2.x (バージョン 2.17.102 以降) には、スマート設定のデフォルト機能が備わっています。この機能は、HTTP クライアントの 2 つのプロパティと HTTP クライアントに影響しない他のプロパティを最適化します。
スマート設定のデフォルトは、指定したデフォルトモードの値に基づいて、connectTimeoutInMillis および tlsNegotiationTimeoutInMillis プロパティに適切な値を設定します。デフォルトモードの値は、アプリケーションの特性に基づいて選択します。
スマート設定のデフォルトおよびアプリケーションに最適なデフォルトモードの値を選択する方法の詳細については、「AWS SDKs and Tools リファレンスガイド」を参照してください。
アプリケーションのデフォルトモードを設定する 4 つの方法は以下のとおりです。
システムプロパティ、環境変数、または AWS 設定ファイルを使用してデフォルトモードをグローバルに設定すると、HTTP クライアントを構築するときに設定を上書きできます。
httpClientBuilder() メソッドで HTTP クライアントを構築すると、設定は構築するインスタンスにのみ適用されます。この例をこちらに示します。この例の Netty ベースの HTTP クライアントは、connectTimeoutInMillis および tlsNegotiationTimeoutInMillis にグローバルに設定されているデフォルトモード値のをすべて上書きします。