Code temporanee di Amazon SQS - Amazon Simple Queue Service

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à.

Code temporanee di Amazon SQS

Le code temporanee consentono di risparmiare tempo di sviluppo e costi di implementazione quando si utilizzano schemi di messaggi comuni come request-response. È possibile utilizzare il Temporary Queue Client per creare code temporanee ad alta velocità, convenienti e gestite dalle applicazioni.

Il client mappa automaticamente più code temporanee, code gestite da applicazioni create su richiesta per un particolare processo, su una singola coda Amazon SQS. In questo modo l'applicazione può effettuare meno chiamate API e incrementare il throughput quando il traffico per ogni coda temporanea è basso. Quando una coda temporanea non è più in uso, il client la pulisce automaticamente, anche se alcuni processi che utilizzano il client non sono chiusi correttamente.

Di seguito sono elencati i vantaggi delle code temporanee:

  • Agiscono da canali di comunicazione leggeri per specifici thread o processi.

  • Possono essere creati ed eliminati senza incorrere in costi aggiuntivi.

  • Sono compatibili a livello di API con le code statiche (normali) Amazon SQS. Ciò significa che il codice esistente che invia e riceve messaggi può inviare e ricevere messaggi dalle code virtuali.

Argomenti

Code virtuali

Le code virtuali sono strutture di dati locali create da Temporary Queue Client. Le code virtuali consentono di combinare più destinazioni a traffico ridotto in un'unica coda Amazon SQS. Per le best practice, consulta Evitare di riutilizzare lo stesso ID gruppo di messaggi con le code virtuali.

Nota
  • Quando si crea una coda virtuale vengono create solo le strutture di dati temporanee in cui i consumatori ricevono i messaggi. Dato che una coda virtuale non effettua chiamate API a Amazon SQS, le code virtuali non prevedono costi.

  • Le quote TPS si applicano a tutte le code virtuali in una singola coda host. Per ulteriori informazioni, consulta Quote di messaggi Amazon SQS.

La classe wrapper AmazonSQSVirtualQueuesClient aggiunge il supporto per gli attributi relativi alle code virtuali. Per creare una coda virtuale, è necessario chiamare l'operazione API CreateQueue utilizzando l'attributo HostQueueURL. Questo attributo specifica la coda esistente che ospita le code virtuali.

L'URL di una coda virtuale è nel formato seguente.

https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue#MyVirtualQueueName

Quando un produttore chiama l'operazione API SendMessageBatch o SendMessage sull'URL di una coda virtuale, Temporary Queue Client esegue queste operazioni:

  1. Estrae il nome della coda virtuale.

  2. Collega il nome della coda virtuale come ulteriore attributo del messaggio.

  3. Invia il messaggio alla coda host.

Mentre il produttore invia messaggi, un thread in background esegue il polling della coda host e invia i messaggi ricevuti alle code virtuali in base ai corrispondenti attributi di messaggio.

Mentre il consumatore chiama l'operazione API ReceiveMessage sull'URL di una coda virtuale, Temporary Queue Client blocca la chiamata in locale finché il thread in background non invia un messaggio alla coda virtuale. Si tratta di una procedura simile al prefetching del messaggio nel Buffered Asynchronous Client: una singola operazione API può fornire messaggi fino a 10 code virtuali). L'eliminazione di una coda virtuale rimuove tutte le risorse lato client, senza chiamare Amazon SQS.

La classe AmazonSQSTemporaryQueuesClient trasforma automaticamente tutte le code che crea in code temporanee. Inoltre, crea automaticamente le code host con gli stessi attributi della coda, su richiesta. Questi nomi di code condividono un prefisso comune configurabile (per impostazione predefinita __RequesterClientQueues__) che li identifica come code temporanee. In questo modo il client può agire da sostituzione drop-in che ottimizza la coda esistente che crea ed elimina le code. Il client include anche le interfacce AmazonSQSRequester e AmazonSQSResponder che consentono la comunicazione bidirezionale tra le code.

Modelli di messaggistica richiesta-risposta (code virtuali)

Il caso d'uso più comune per le code temporanee è il modello di messaggistica richiesta-risposta, in cui un richiedente crea una coda temporanea per la ricezione di ciascun messaggio di risposta. Per evitare di creare una coda Amazon SQS per ogni messaggio di risposta, Temporary Queue Client consente di creare ed eliminare più code temporanee senza effettuare chiamate API Amazon SQS. Per ulteriori informazioni, consulta Implementazione di sistemi Richiesta-Risposta.

Il diagramma seguente mostra una configurazione comune che usa questo modello.

Diagramma del modello di richiesta-risposta utilizzato con Amazon SQS.

Scenario di esempio: elaborazione di una richiesta di accesso

Il seguente scenario di esempio mostra come usare le interfacce AmazonSQSResponder e AmazonSQSRequester per elaborare la richiesta di accesso di un utente.

Sul lato client

public class LoginClient { // Specify the Amazon SQS queue to which to send requests. private final String requestQueueUrl; // Use the AmazonSQSRequester interface to create // a temporary queue for each response. private final AmazonSQSRequester sqsRequester = AmazonSQSRequesterClientBuilder.defaultClient(); LoginClient(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Send a login request. public String login(String body) throws TimeoutException { SendMessageRequest request = new SendMessageRequest() .withMessageBody(body) .withQueueUrl(requestQueueUrl); // If no response is received, in 20 seconds, // trigger the TimeoutException. Message reply = sqsRequester.sendMessageAndGetResponse(request, 20, TimeUnit.SECONDS); return reply.getBody(); } }

L'invio di una richiesta di accesso esegue queste operazioni:

  1. Crea una coda temporanea.

  2. Collega l'URL della coda temporanea al messaggio come attributo.

  3. Invia il messaggio.

  4. Riceve una risposta dalla coda temporanea.

  5. Elimina la coda temporanea.

  6. Restituisce la risposta.

Sul lato server

L'esempio seguente presuppone che, al momento della creazione, venga creato un thread per eseguire il polling della coda e chiamare il metodo handleLoginRequest() per ogni messaggio. Inoltre, presuppone l'uso del metodo doLogin().

public class LoginServer { // Specify the Amazon SQS queue to poll for login requests. private final String requestQueueUrl; // Use the AmazonSQSResponder interface to take care // of sending responses to the correct response destination. private final AmazonSQSResponder sqsResponder = AmazonSQSResponderClientBuilder.defaultClient(); LoginServer(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Process login requests from the client. public void handleLoginRequest(Message message) { // Process the login and return a serialized result. String response = doLogin(message.getBody()); // Extract the URL of the temporary queue from the message attribute // and send the response to the temporary queue. sqsResponder.sendResponseMessage(MessageContent.fromMessage(message), new MessageContent(response)); } }

Pulizia delle query

Per garantire che Amazon SQS recuperi tutte le risorse in memoria utilizzate dalle code virtuali, quando l'applicazione non ha più bisogno di Temporary Queue Client, deve chiamare il metodo shutdown(). Puoi anche utilizzare il metodo shutdown() dell'interfaccia AmazonSQSRequester.

Temporary Queue Client, inoltre, fornisce un modo per eliminare le code host orfane. Per ogni coda che riceve una chiamata API in un periodo di tempo (per impostazione predefinita, cinque minuti), il client utilizza l'operazione API TagQueue per applicare tag a una coda che rimane in uso.

Nota

Qualsiasi operazione API eseguita su una coda la contrassegna come non inattiva, compresa un'operazione ReceiveMessage che non restituisce messaggi.

Il thread in background usa le operazioni API ListQueues e ListTags per controllare tutte le code con il prefisso configurato, eliminando quelle che non sono state contrassegnate con tag per almeno cinque minuti. In questo modo, se un client non si chiude correttamente, gli altri client attivi vengono puliti dopo di esso. Per ridurre le duplicazioni di lavoro, tutti i client con lo stesso prefisso comunicano attraverso una coda di lavoro interna condivisa, il cui nome corrisponde al prefisso.