AWS SDK for Java 2.x 的最佳實務 - AWS SDK for Java 2.x

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

AWS SDK for Java 2.x 的最佳實務

本節列出了使用適用於 Java 2.x 的 SDK 的最佳做法。

如果可能的話,重複使用 SDK 用戶端

每個 SDK 用戶端都會維護自己的 HTTP 連線集區。儲存池中已存在的連線可由新要求重複使用,以減少建立新連線的時間。我們建議共用用戶端的單一執行個體,以避免產生太多未有效使用的連線集區所產生的額外負荷。所有 SDK 客戶端都是線程安全的。

如果您不想共享客戶端實例,請close()在不需要客戶端時調用該實例以釋放資源。

關閉用戶端作業的輸入串流

對於流操作,例如S3Client#getObject,如果您ResponseInputStream直接使用,我們建議您執行以下操作:

  • 盡快從輸入流中讀取所有數據。

  • 盡快關閉輸入流。

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

根據效能測試調整 HTTP 組態

SDK 提供了一組適用於一般使用案例的預設 http 設定。我們建議客戶根據其使用案例調整其應用程式的 HTTP 組態。

作為一個很好的起點,SDK 提供了智能配置默認功能。此功能從 2.17.102 版開始提供。您可以根據使用案例選擇模式,該模式可提供合理的配置值。

針對以網路為基礎的 HTTP 用戶端使用 OpenSSL

依預設,SDK NettyNioAsyncHttpClient會使用 JDK 的預設 SSL 實作作為SslProvider. 我們的測試發現 OpenSSL 的性能優於 JDK 的默認實現。網路社群也建議使用 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

此設定會設定單一 HTTP 嘗試的時間長度,之後可以重試 API 呼叫。

apiCallTimeout

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

除了在服務用戶端上設定這些逾時值,您可以使用RequestOverrideConfiguration#apiCallTimeout()RequestOverrideConfiguration#apiCallAttemptTimeout()設定單一要求。

下列範例會使用自訂逾時值來設定單一listBuckets要求。

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

當您一起使用這些屬性時,您可以對重試的所有嘗試所花費的總時間設定強制限制。您還可以將單個 HTTP 請求設置為在緩慢的請求中快速失敗。

使用指標

SDK for Java 可以收集應用程式中服務用戶端的指標。您可以使用這些指標來識別效能問題、檢閱整體使用趨勢、檢視傳回的服務用戶端例外狀況,或深入瞭解特定問題。

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