Best practice per AWS SDK for Java 2.x - AWS SDK for Java 2.x

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Best practice per AWS SDK for Java 2.x

Questa sezione elenca le best practice per l'utilizzo dell'SDK for Java 2.x.

Riutilizza un client SDK, se possibile

Ogni client SDK mantiene il proprio pool di connessioni HTTP. Una connessione già esistente nel pool può essere riutilizzata con una nuova richiesta per ridurre il tempo necessario per stabilire una nuova connessione. Ti consigliamo di condividere una singola istanza del client per evitare il sovraccarico dovuto alla presenza di troppi pool di connessioni che non vengono utilizzati in modo efficace. Tutti i client SDK sono thread-safe.

Se non desideri condividere un'istanza client, richiedi close() all'istanza di rilasciare le risorse quando il client non è necessario.

Chiudi i flussi di input dalle operazioni del client

Per operazioni di streamingS3Client#getObject, ad esempio se lavori ResponseInputStream direttamente con, ti consigliamo di fare quanto segue:

  • Leggi tutti i dati del flusso di input il prima possibile.

  • Chiudi il flusso di input il prima possibile.

Forniamo questi consigli perché il flusso di input è un flusso diretto di dati proveniente dalla connessione HTTP e la connessione HTTP sottostante non può essere riutilizzata finché tutti i dati dello stream non sono stati letti e lo stream non viene chiuso. Se queste regole non vengono seguite, il client può esaurire le risorse allocando troppe connessioni HTTP aperte ma inutilizzate.

Ottimizza le configurazioni HTTP in base ai test delle prestazioni

L'SDK fornisce un set di configurazioni http predefinite che si applicano a casi d'uso generali. Consigliamo ai clienti di ottimizzare le configurazioni HTTP per le loro applicazioni in base ai loro casi d'uso.

Come buon punto di partenza, l'SDK offre una funzionalità di configurazione predefinita intelligente. Questa funzionalità è disponibile a partire dalla versione 2.17.102. È possibile scegliere una modalità in base al caso d'uso, che fornisce valori di configurazione ragionevoli.

Usa OpenSSL per il client HTTP basato su Netty

Per impostazione predefinita, l'SDK NettyNioAsyncHttpClientutilizza l'implementazione SSL predefinita di JDK come. SslProvider I nostri test hanno rilevato che OpenSSL offre prestazioni migliori rispetto all'implementazione predefinita di JDK. La community di Netty consiglia inoltre di utilizzare OpenSSL.

Per usare OpenSSL, netty-tcnative aggiungilo alle tue dipendenze. Per i dettagli di configurazione, consulta la documentazione del progetto Netty.

Dopo aver netty-tcnative configurato il progetto, l'NettyNioAsyncHttpClientistanza selezionerà automaticamente OpenSSL. In alternativa, puoi impostarlo in SslProvider modo esplicito utilizzando il NettyNioAsyncHttpClient builder, come mostrato nel seguente frammento.

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

Configura i timeout delle API

L'SDK fornisce valori predefiniti per alcune opzioni di timeout, come il timeout di connessione e i timeout dei socket, ma non per i timeout delle chiamate API o i timeout dei singoli tentativi di chiamata API. È buona norma impostare i timeout sia per i singoli tentativi che per l'intera richiesta. Ciò garantirà un guasto rapido dell'applicazione in modo ottimale in caso di problemi temporanei che potrebbero causare tempi più lunghi per il completamento dei tentativi di richiesta o problemi di rete irreversibili.

È possibile configurare i timeout per tutte le richieste effettuate dai client di un servizio utilizzando and. ClientOverrideConfiguration#apiCallAttemptTimeout ClientOverrideConfiguration#apiCallTimeout

L'esempio seguente mostra la configurazione di un client Amazon S3 con valori di timeout personalizzati.

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

Questa impostazione imposta la quantità di tempo per un singolo tentativo HTTP, dopodiché la chiamata API può essere ritentata.

apiCallTimeout

Il valore di questa proprietà configura la quantità di tempo per l'intera esecuzione, inclusi tutti i tentativi di nuovo tentativo.

In alternativa all'impostazione di questi valori di timeout sul client del servizio, è possibile utilizzare RequestOverrideConfiguration#apiCallTimeout()e RequestOverrideConfiguration#apiCallAttemptTimeout() configurare una singola richiesta.

L'esempio seguente configura una singola listBuckets richiesta con valori di timeout personalizzati.

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

Quando si utilizzano queste proprietà insieme, si imposta un limite rigido al tempo totale impiegato per tutti i tentativi tra più tentativi. È inoltre possibile impostare una richiesta HTTP individuale in modo che abbia esito negativo rapidamente in caso di richiesta lenta.

Usa le metriche

L'SDK for Java può raccogliere metriche per i client di servizio dell'applicazione. Puoi utilizzare queste metriche per identificare problemi di prestazioni, esaminare le tendenze complessive di utilizzo, esaminare le eccezioni restituite dai client di servizio o per approfondire un problema particolare.

Ti consigliamo di raccogliere parametri, quindi analizzare Amazon CloudWatch Logs, per ottenere una comprensione più approfondita delle prestazioni della tua applicazione.