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

Timeout visibilità Amazon SQS

Quando un consumatore riceve ed elabora un messaggio da una coda, il messaggio rimane nella coda. Amazon SQS non elimina automaticamente il messaggio. Poiché Amzon SQS è un sistema distribuito, non vi è alcuna garanzia che il consumatore effettivamente riceva il messaggio (ad esempio, a causa di un problema di connessione, oppure a causa di un problema nell'applicazione del consumatore). Di conseguenza, il consumatore deve eliminare il messaggio dalla coda dopo la ricezione e l'elaborazione.

Grafico temporale che mostra come le richieste vengono elaborate durante il timeout di visibilità

Immediatamente dopo che il messaggio viene ricevuto, rimane nella coda. Per prevenire che altri consumatori elaborino nuovamente il messaggio, Amazon SQS imposta un timeout visibilità, un periodo di tempo durante il quale Amazon SQS impedisce ad altri consumatori di ricevere ed elaborare il messaggio. Il timeout visibilità predefinito per una coda è di 30 secondi. Il valore minimo è 0 secondi. La durata massima è 12 ore. Per ulteriori informazioni sulla configurazione del timeout di visibilità per una coda mediante la console, consultare Configurazione dei parametri della coda tramite la console Amazon SQS.

Nota

Per le code standard il timeout visibilità non garantisce che un messaggio non venga ricevuto due volte. Per ulteriori informazioni, consulta Consegna Amazon at-least-once SQS.

Le code FIFO consentono al produttore o al consumatore di fare più tentativi:

  • Se il produttore rileva un'azione SendMessage non riuscita, può ritentare l'invio tutte le volte che è necessario, utilizzando lo stesso ID di deduplicazione del messaggio. Supponendo che il produttore riceva almeno una conferma prima della scadenza dell'intervallo di deduplicazione, più tentativi non influiscono sull'ordine dei messaggi né introducono duplicati.

  • Se il consumatore rileva un'azione ReceiveMessage non riuscita, può riprovare tutte le volte che è necessario, utilizzando lo stesso ID del tentativo di richiesta di ricezione. Supponendo che il consumatore riceva almeno una conferma prima della scadenza del timeout di visibilità, più tentativi non influiscono sull'ordine dei messaggi.

  • Quando ricevi un messaggio con un ID gruppo di messaggi, non vengono restituiti altri messaggi per lo stesso ID gruppo di messaggi a meno che non elimini il messaggio o non diventi visibile.

Messaggi in transito

Un messaggio Amazon SQS ha tre stati di base:

  1. Inviato a una coda da un produttore.

  2. Ricevuto dalla coda da un consumatore.

  3. Eliminato dalla coda.

Un messaggio viene considerato archiviato dopo essere stato inviato a una coda da un produttore, ma non ancora ricevuto dalla coda da un consumatore (ossia, tra gli stati 1 e 2). Non è prevista alcuna quota per il numero di messaggi archiviati. Un messaggio viene considerato in transito dopo essere stato ricevuto da una coda da un consumatore, ma non ancora eliminato dalla coda (ossia, tra gli stati 2 e 3). Non è prevista alcuna quota per il numero di messaggi in transito.

Importante

Le quote che si applicano ai messaggi in transito non sono correlate al numero illimitato di messaggi archiviati.

Per la maggior parte delle code standard (a seconda del traffico in coda e del backlog di messaggi), possono esserci un massimo di circa 120.000 messaggi in transito (ricevuti da una coda da un consumatore, ma non ancora eliminati dalla coda). Se si raggiunge questa quota durante l'utilizzo del polling breve, Amazon SQS restituisce il messaggio di errore OverLimit. Se si utilizza un long polling, Amazon SQS non restituisce alcun messaggio di errore. Per evitare di raggiungere la quota, elimina i messaggi dalla coda dopo che sono stati elaborati. Puoi anche aumentare il numero di code utilizzate per elaborare i messaggi. Per richiedere un incremento della quota, invia una richiesta di supporto.

Per le code FIFO, possono esserci un massimo di 20.000 messaggi in corso (ricevuti da una coda da un consumatore, ma non ancora eliminati dalla coda). Se raggiungi questa quota, Amazon SQS non restituisce alcun messaggio di errore.

Importante

Quando si lavora con le code FIFO, le operazioni DeleteMessage falliranno se la richiesta viene ricevuta al di fuori della finestra di timeout di visibilità. Se il timeout di visibilità è 0 secondi, il messaggio deve essere eliminato entro lo stesso millisecondo in cui è stato inviato, altrimenti viene considerato abbandonato. Ciò può far sì che Amazon SQS includa messaggi duplicati nella stessa risposta a un'operazione ReceiveMessage se il parametro MaxNumberOfMessages è maggiore di 1. Per ulteriori dettagli, consulta Come funziona l'API FIFO di Amazon SQS.

Impostazione del timeout visibilità

Il timeout visibilità inizia quando Amazon SQS restituisce un messaggio. Durante tale periodo, il consumatore elabora ed elimina il messaggio. Tuttavia, se il consumatore ha esito negativo prima di eliminare il messaggio e il tuo sistema non chiama l'operazione DeleteMessage per quel messaggio prima della scadenza di un timeout visibilità, il messaggio diventa visibile ad altri consumatori e viene ricevuto nuovamente. Se un messaggio deve essere ricevuto solo una volta, il tuo consumatore deve eliminarlo entro la durata del timeout visibilità.

Per ogni coda Amazon SQS, l'impostazione del timeout visibilità predefinita è di 30 secondi. Puoi modificare questa impostazione per l'intera coda. Di solito devi impostare il timeout visibilità sul tempo massimo necessario alla tua applicazione per elaborare ed eliminare un messaggio dalla coda. Quando ricevi messaggi, puoi anche impostare un timeout visibilità speciali per i messaggi restituiti senza modificare il timeout della coda generale. Per ulteriori informazioni, consulta le best practice nella sezione Elaborazione tempestiva dei messaggi in Amazon SQS.

Se non sai quanto tempo sia necessario per elaborare un messaggio, crea un heartbeat per il processo del consumatore: specifica il timeout visibilità iniziale (ad esempio, 2 minuti) e poi, se il consumatore lavora ancora sul messaggio, continua a estendere il timeout visibilità di 2 minuti ogni minuto.

Importante

Il timeout massimo di visibilità è di 12 ore dal momento in cui Amazon SQS riceve la richiesta ReceiveMessage. L'estensione del timeout di visibilità non reimposta il massimo di 12 ore.

Inoltre, potresti non essere in grado di impostare il timeout per un singolo messaggio per tutte le 12 ore (ad esempio 43.200 secondi) trascorse dalla richiesta ReceiveMessage che avvia il timer. Ad esempio, se si riceve un messaggio e si imposta immediatamente il limite massimo di 12 ore inviando una chiamata ChangeMessageVisibility della durata di 43.200 secondi, è probabile che la chiamata abbia esito negativo. Tuttavia, l'utilizzo di un valore di 43.195 secondi funzionerà a meno che non vi sia un ritardo significativo tra la richiesta del messaggio tramite ReceiveMessage e l'aggiornamento del timeout di visibilità. Se il consumatore ha bisogno di più di 12 ore, prendere in considerazione l'utilizzo di Step Functions.

Modifica del timeout visibilità per un messaggio

Quando ricevi un messaggio da una coda e inizi a elaborarlo, il timeout visibilità per la coda può essere insufficiente (ad esempio, potresti dover elaborare ed eliminare un messaggio). Puoi accorciare o estendere la visibilità di un messaggio specificando un nuovo valore di timeout utilizzando l'operazione ChangeMessageVisibility.

Ad esempio, se il timeout predefinito per una coda è di 60 secondi, sono trascorsi 15 secondi da quando è stato ricevuto il messaggio e invii una chiamata ChangeMessageVisibility con VisibilityTimeout impostato su 10 secondi, i 10 secondi iniziano a essere contati dal momento in cui effettui la chiamata ChangeMessageVisibility. Pertanto, qualsiasi tentativo di modificare il timeout visibilità o di eliminare il messaggio 10 secondi dopo aver inizialmente modificato il timeout visibilità (un totale di 25 secondi) può generare un errore.

Nota

Il nuovo periodo di timeout diventa effettivo dal momento in cui si chiama l'operazione ChangeMessageVisibility. Inoltre, il nuovo periodo di timeout si applica solo alla particolare ricezione del messaggio. ChangeMessageVisibility non influenza il timeout di ricezioni successive del messaggio o di code successive.

Interruzione del timeout visibilità per un messaggio

Quando ricevi un messaggio da una coda, potresti capire che effettivamente non vuoi elaborarlo ed eliminarlo. Amazon SQS ti consente di terminare il timeout visibilità per un determinato messaggio. In questo modo il messaggio diventa immediatamente visibile ad altri componenti nel sistema e disponibile per l'elaborazione.

Per terminare il timeout visibilità di un messaggio dopo aver chiamato ReceiveMessage, chiama ChangeMessageVisibility con VisibilityTimeout impostato su 0 secondi.