

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 的最佳實務 AWS SDK for Java 2.x
<a name="best-practices"></a>

## 透過設定 API 逾時來防止掛起請求
<a name="bestpractice5"></a>

開發套件提供一些逾時選項的[預設值](https://github.com/aws/aws-sdk-java-v2/blob/a0c8a0af1fa572b16b5bd78f310594d642324156/http-client-spi/src/main/java/software/amazon/awssdk/http/SdkHttpConfigurationOption.java#L134)，例如連線逾時和通訊端逾時，但不適用於 API 呼叫逾時或個別 API 呼叫嘗試逾時。最佳實務是設定個別嘗試和整個請求的逾時。這將確保您的應用程式在發生暫時性問題時以最佳方式快速失敗，這可能會導致請求嘗試花費更長的時間來完成或導致嚴重的網路問題。

您可以使用 `[ClientOverrideConfiguration\$1apiCallAttemptTimeout](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/config/ClientOverrideConfiguration.html#apiCallAttemptTimeout())`和 為服務用戶端提出的所有請求設定逾時`[ClientOverrideConfiguration\$1apiCallTimeout](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/config/ClientOverrideConfiguration.html#apiCallTimeout())`。

下列範例顯示具有自訂逾時值的 Amazon S3 用戶端組態。

```
S3Client.builder()
        .overrideConfiguration(
             b -> b.apiCallTimeout(Duration.ofSeconds(<custom value>))
                   .apiCallAttemptTimeout(Duration.ofMillis(<custom value>)))
        .build();
```

**`apiCallAttemptTimeout`**  
此設定會設定單一 HTTP 嘗試的時間量，之後即可重試 API 呼叫。

**`apiCallTimeout`**  
此屬性的值會設定整個執行的時間量，包括所有重試嘗試。

除了在服務用戶端上設定這些逾時值之外，您也可以使用 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/RequestOverrideConfiguration.html#apiCallTimeout()](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/RequestOverrideConfiguration.html#apiCallTimeout())和 `[RequestOverrideConfiguration\$1apiCallAttemptTimeout()](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/RequestOverrideConfiguration.html#apiCallAttemptTimeout())` 來設定單一請求 。

下列範例會設定具有自訂逾時值的單一`listBuckets`請求。

```
s3Client.listBuckets(lbr -> lbr.overrideConfiguration(
        b -> b.apiCallTimeout(Duration.ofSeconds(<custom value>))
               .apiCallAttemptTimeout(Duration.ofMillis(<custom value>))));
```

當您將這些屬性一起使用時，您可以針對所有重試嘗試所花費的總時間設定硬性限制。您也可以將個別 HTTP 請求設定為在慢速請求上快速失敗。

## 透過重複使用 服務用戶端來改善效能
<a name="bestpractice1"></a>

每個[服務用戶端](work-witih-clients.md)都會維護自己的 HTTP 連線集區。已存在於集區的連線可由新的請求重複使用，以縮短建立新連線的時間。我們建議共用用戶端的單一執行個體，以避免過多連線集區未有效使用的負荷。所有服務用戶端都是執行緒安全。

如果您不想共用用戶端執行個體，請在執行個體`close()`上呼叫 ，以在不需要用戶端時釋出資源。

## 關閉未使用的服務用戶端以防止資源洩漏
<a name="bestpractice-close-client"></a>

如果不再需要執行緒，請關閉[服務用戶端](work-witih-clients.md)以釋出資源，例如執行緒。如果您不想共用用戶端執行個體，請在執行個體`close()`上呼叫 ，以在不需要用戶端時釋出資源。

## 關閉輸入串流以防止連線集區耗盡
<a name="bestpractice2"></a>

對於 等串流操作`[S3Client\$1getObject](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#getObject(java.util.function.Consumer,java.nio.file.Path))`，如果您`[ResponseInputStream](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/ResponseInputStream.html)`直接使用 ，我們建議您執行下列動作：
+ 盡快讀取輸入串流中的所有資料。
+ 儘快關閉輸入串流。

我們提出這些建議，因為輸入串流是來自 HTTP 連線的直接資料串流，而且在讀取串流中的所有資料且串流關閉之前，無法重複使用基礎 HTTP 連線。如果未遵循這些規則，用戶端可以透過配置太多開啟但未使用的 HTTP 連線來耗盡資源。

## 為您的應用程式工作負載最佳化 HTTP 效能
<a name="bestpractice3"></a>

SDK 提供一組適用於一般使用案例[的預設 http 組態](https://github.com/aws/aws-sdk-java-v2/blob/master/http-client-spi/src/main/java/software/amazon/awssdk/http/SdkHttpConfigurationOption.java)。我們建議客戶根據其使用案例，為其應用程式調整 HTTP 組態。

開發套件提供[智慧型組態預設值](http-configuration.md#http-config-smart-defaults)功能，是很好的起點。此功能從 2.17.102 版開始可用。您可以根據您的使用案例選擇模式，以提供合理的組態值。

## 使用非同步用戶端的 OpenSSL 改善 SSL 效能
<a name="bestpractice4"></a>

根據預設，開發套件的 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html)會使用 JDK 的預設 SSL 實作做為 `SslProvider`。我們的測試發現 OpenSSL 的效能優於 JDK 的預設實作。Netty 社群也[建議使用 OpenSSL](https://netty.io/wiki/requirements-for-4.x.html#tls-with-openssl)。

若要使用 OpenSSL，請將 `netty-tcnative`新增至您的相依性。如需組態詳細資訊，請參閱 [Netty 專案文件](https://netty.io/wiki/forked-tomcat-native.html)。

在您為專案`netty-tcnative`設定 之後，`NettyNioAsyncHttpClient`執行個體會自動選取 OpenSSL。或者，您可以使用`NettyNioAsyncHttpClient`建置器`SslProvider`明確設定 ，如下列程式碼片段所示。

```
NettyNioAsyncHttpClient.builder()
                        .sslProvider(SslProvider.OPENSSL)
                        .build();
```

## 使用 SDK 指標監控應用程式效能
<a name="bestpractice6"></a>

適用於 Java 的 SDK 可以[收集應用程式中服務用戶端的指標](metrics.md)。您可以使用這些指標來識別效能問題、檢閱整體用量趨勢、檢閱傳回的服務用戶端例外狀況，或深入了解特定問題。

我們建議您收集指標，然後分析 Amazon CloudWatch Logs，以便更深入了解應用程式的效能。