本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS SDK for Java 2.x 的最佳實務
本節列出了使用適用於 Java 2.x 的 SDK 的最佳做法。
如果可能的話,重複使用 SDK 用戶端
每個 SDK 用戶端都會維護自己的 HTTP 連線集區。儲存池中已存在的連線可由新要求重複使用,以減少建立新連線的時間。我們建議共用用戶端的單一執行個體,以避免產生太多未有效使用的連線集區所產生的額外負荷。所有 SDK 客戶端都是線程安全的。
如果您不想共享客戶端實例,請close()
在不需要客戶端時調用該實例以釋放資源。
關閉用戶端作業的輸入串流
對於流操作,例如S3Client#getObject
,如果您ResponseInputStream
直接使用,我們建議您執行以下操作:
-
盡快從輸入流中讀取所有數據。
-
盡快關閉輸入流。
我們提出這些建議是因為輸入串流是來自 HTTP 連線的直接資料串流,而且在讀取串流中的所有資料並關閉串流之後,才能重複使用基礎 HTTP 連線。如果未遵循這些規則,則用戶端可以透過分配太多開啟但未使用的 HTTP 連線來耗盡資源。
根據效能測試調整 HTTP 組態
SDK 提供了一組適用於一般使用案例的預設 http
作為一個很好的起點,SDK 提供了智能配置默認功能。此功能從 2.17.102 版開始提供。您可以根據使用案例選擇模式,該模式可提供合理的配置值。
針對以網路為基礎的 HTTP 用戶端使用 OpenSSL
依預設,SDK NettyNioAsyncHttpClient
SslProvider
. 我們的測試發現 OpenSSL 的性能優於 JDK 的默認實現。網路社群也建議使用 OpenSSL
若要使用 OpenSSL,請新增netty-tcnative
至您的相依性。有關配置的詳細信息,請參閱 Netty 項目文檔
為專案netty-tcnative
設定完成後,NettyNioAsyncHttpClient
執行個體會自動選取 OpenSSL。或者,您可以使用NettyNioAsyncHttpClient
生成器SslProvider
顯式設置,如下面的代碼片段所示。
NettyNioAsyncHttpClient.builder() .sslProvider(SslProvider.OPENSSL) .build();
設定 API 逾時時間
SDK 會為某些逾時選項 (例如連線逾時和通訊端逾時) 提供預設值
您可以使用ClientOverrideConfiguration#apiCallAttemptTimeout
和ClientOverrideConfiguration#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 日誌,以便更深入地了解應用程式的效能。