2014-05-01 10 views
14

Esiste un modo consigliato per gestire la connessione ad AmazonS3 quando si lavora con AWS?Gestione connessione AmazonS3

Il tipico codice Amazon S3 (preso da esempio ufficiale di Amazon) sembra di solito questo?

AmazonS3 s3 = new AmazonS3Client(...); 
... 
s3.putObject(new PutObjectRequest(bucketName, project.getName() + "/" + imageFile.getName(), imageFile)); 

seguito sono le domande:

  • questa è una buona idea per mantenere un unico AmazonS3Client usata da tutti in codice o è meglio creare uno su ogni chiamata?

  • Esiste un concetto di pool di connessioni come quando si lavora con MySQL, ad esempio?

  • Sono domande come la disconnessione (analogia MySQL: MySQL è stato riavviato) rilevanti in modo tale che l'AmazonS3Client diventi non valido e richieda la ricreazione? Quale sarebbe il modo giusto per gestire una disconnessione in caso affermativo?

  • Qualcuno sa quali caratteristiche sono fornite dal integrazione primavera con AWS a: https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-aws

Thx.

+0

hey, l'hai risolto con singletone? – 2Big2BeSmall

+0

Ho usato un singletone –

risposta

19

io ripeto le domande per essere chiari:

E 'una buona idea per mantenere un unico AmazonS3Client usata da tutti nel codice o è meglio crearne uno su ogni chiamata?

Tutte le classi client nell'SDK Java sono thread-safe, quindi in genere è consigliabile riutilizzare un singolo client piuttosto che istanziarne di nuovi. O pochi, se stai operando contemporaneamente su più regioni o credenziali.

Esiste un concetto di pool di connessioni come quando si lavora con MySQL, ad esempio?

Sì, c'è la gestione della connessione nel client, specialmente se si utilizza la classe al posto del AmazonS3Client direttamente TransferManager.

vedi: http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html

sono domande come disconnessione (MySQL analogia: MySQL è stato riavviato) rilevanti in modo tale che l'AmazonS3Client sarebbe più validi e richiedono ri-creazione? Quale sarebbe il modo giusto per gestire una disconnessione se così?

Per impostazione predefinita, il client esegue nuovamente il backoff esponenziale per errori recuperabili. Se davvero fallisce/si disconnette, è necessario gestire l'eccezione appropriata per la propria app. vedere: http://docs.aws.amazon.com/general/latest/gr/api-retries.html

Qualcuno kwow cosa fearures sono forniti dall'integrazione primavera con AWS a: https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-aws

Fornisce dichiarativa di un'istanza, iniezione e classi di utilità per l'integrazione più facile in progetti di primavera, in modo simile ci sono aiutanti per JDBC, JMS, ecc ...

Per ulteriori suggerimenti e trucchi AWS SDK, vedere: http://aws.amazon.com/articles/3604?_encoding=UTF8&jiveRedirect=1

+0

Thx. Per quanto riguarda Transfer Manager, il link dice che è appropriato per il contenuto di grandi dimensioni che non è esattamente il mio caso dato che ho a che fare con file abbastanza piccoli. È sempre meglio usare il gestore di trasferimento sul normale S3client? –

+0

Per quanto riguarda il meccanismo di ripetizione fornito dall'SDK AWS, questo è sincrono? In altri termini se la richiesta non riesce, il chiamante verrà bloccato mentre l'AWS SDK riproverà? –

+0

È sincronizzato a meno che non si utilizzino i client asincroni, vedere: https://aws.amazon.com/articles/5496117154196801 –

9

ci sono cose importanti da notare le seguenti due domande:

questa è una buona idea per mantenere un unico AmazonS3Client usata da tutti in codice o è meglio per creare uno su ogni chiamata?

Creare solo uno. AmazonS3Client presenta una disfunzione che quando vengono eliminati dati inutili, pulisce le risorse condivise da altre istanze AmazonS3Client, causando l'invalidità di tali istanze, anche se queste altre istanze si trovano nel mezzo della gestione di un caricamento o di un download. Abbiamo riscontrato questo problema quando stavamo creando un AmazonS3Client per ogni richiesta. Apparentemente Amazon non considera questo un bug. Questa disfunzione può essere evitata creando un solo AmazonS3Client, conservandolo per tutta la vita dell'applicazione e utilizzandolo in tutti i thread del codice.

Sono domande come la disconnessione (analogia MySQL: MySQL è stato riavviato) rilevanti in modo tale che l'AmazonS3Client diventi non valido e richieda la ricreazione? Quale sarebbe il modo giusto per gestire una disconnessione in caso affermativo?

Upload e download possono fallire, ma non invalideranno AmazonS3Client, che può ancora essere utilizzato. Il modo corretto di gestire una disconnessione che non viene ripetuta con successo da AmazonS3Client è di riprovare se stessi o segnalare l'errore, come appropriato per la propria applicazione, e di continuare a utilizzare AmazonS3Client per eventuali interazioni S3 aggiuntive che è necessario eseguire.

+0

Thx. Per quanto riguarda il processo di garbage collection di AmazonS3Client, questo è molto interessante. Avete un link/ref che lo documenta? –

+0

Purtroppo non riesco a trovare un collegamento ora. Abbiamo riscontrato questo problema nel nostro sistema quando abbiamo creato un AmazonS3Client per ogni utilizzo e abbiamo trovato informazioni in vari punti in cui altri hanno riscontrato questo problema. Penso di aver ottenuto le informazioni googling della nostra specifica traccia dello stack. Gli errori si sono sempre verificati in un client che veniva utilizzato quando un altro client era fuori dal campo di applicazione e presumibilmente era stato raccolto.Una delle pagine che ho trovato era una raccomandazione di Amazon per creare un solo client e usarlo in tutti i thread. Abbiamo cambiato il nostro codice per seguire quella raccomandazione e gli errori sono andati via. –

+0

Nessun problema. Grazie. –

Problemi correlati