Perché la mia coda FIFO di Amazon SQS non restituisce tutti i messaggi o i messaggi in altri gruppi di messaggi?
La mia coda First-In-First-Out (FIFO) di Amazon Simple Queue Service (Amazon SQS) non restituisce alcuni messaggi quando chiamo l'API ReceiveMessage.
Soluzione
Quando utilizzi le code FIFO, non puoi richiedere di ricevere messaggi da un ID di gruppo di messaggi specifico. Inoltre, non puoi filtrare la chiamata API ReceiveMessage per restituire solo i messaggi all'interno di un gruppo di messaggi alla volta.
Quando si specifica un parametro MaxNumberOfMessages nella chiamata API ReceiveMessage, SQS restituisce il maggior numero possibile di messaggi con lo stesso ID di gruppo di messaggi. La chiamata API ReceiveMessage può anche restituire messaggi da altri gruppi di messaggi disponibili.
Per le code FIFO, quando ricevi messaggi che appartengono a un particolare ID di gruppo di messaggi, tieni presente queste linee guida:
- È necessario eliminare i messaggi nell'ID del gruppo di messaggi corrente prima di poter ricevere altri messaggi all'interno dello stesso ID del gruppo di messaggi.
- I messaggi ricevuti, ma non ancora eliminati, sono in stato di transito. I messaggi in transito bloccano il recapito dei messaggi disponibili all'interno dello stesso gruppo di messaggi.
- Uno dei motivi più comuni per cui i messaggi si trovano nello stato di transito è che il client consumer si interrompe inaspettatamente. Un altro motivo corrisponde a una funzione consumer downstream di AWS Lambda che riscontra eccezioni o raggiunge la massima simultaneità.
- L'API ChangeMessageVisibility può estendere o abbreviare il periodo di timeout della visibilità per i messaggi in transito.
- Puoi attendere la scadenza del periodo di timeout di visibilità dei messaggi per consentire nuovamente la consegna dei messaggi.
Per tutte le code FIFO e i limiti di quota di Amazon SQS, tieni presente queste linee guida:
- Le code FIFO consentono un massimo di 20.000 messaggi in transito.
**Nota:**Amazon SQS non restituisce messaggi di errore che superano i limiti di quota. - Le code FIFO possono elaborare fino a 300 transazioni al secondo (TPS, transactions per second) senza attivare una velocità di trasmissione effettiva elevata. Le richieste superiori a 300 TPS ottengono l'errore "ThrottlingException" anche se i messaggi in coda sono disponibili.
- I messaggi della coda FIFO di SQS vengono archiviati in partizioni. Ogni partizione supporta fino a 300 TPS per le operazioni di invio, ricezione ed eliminazione. Per ulteriori informazioni, puoi vedere Optimizing partition utilization.
- È possibile che le code FIFO con velocità di trasmissione effettiva elevata condividano una partizione con più gruppi di messaggi. Se un gruppo di messaggi supera i 300 TPS per la propria partizione, i messaggi provenienti da altri gruppi su quella partizione non vengono recapitati a causa della limitazione (della larghezza di banda della rete).
- Le transazioni al secondo ad alta velocità di trasmissione effettiva della coda FIFO variano a seconda della Regione AWS. Per ulteriori informazioni, consulta Quotas related to messages.
Per ridurre il limite di velocità di trasmissione effettiva di Amazon SQS sulle code FIFO, tieni presente queste linee guida:
- Utilizza le azioni batch dell'API Amazon SQS SendMessageBatch, DeleteMessageBatch e ChangeMessageVisibilityBatch per ridurre i costi o modificare fino a dieci messaggi. Per l'API ReceiveMessage, imposta il parametro MaxNumberOfMessages per ricevere fino a dieci messaggi per transazione. Per ulteriori informazioni, consulta le azioni in batch di Amazon SQS.
- Per le code FIFO con velocità di trasmissione effettiva elevata, segui i consigli per ottimizzare l'utilizzo delle partizioni. Invia messaggi con gli stessi ID di gruppo di messaggi in batch. Elimina i messaggi o modifica i valori di timeout della visibilità dei messaggi in batch con handle di ricezione dalle stesse richieste API ReceiveMessage.
- Attiva una velocità di trasmissione effettiva elevata per le code FIFO.
- Per le code FIFO con velocità di trasmissione effettiva elevata, utilizza un MessageGroupID con più valori univoci. Ciò consente una distribuzione uniforme tra le partizioni della coda FIFO. Per ulteriori informazioni, consulta Using the Amazon SQS message group ID.
Una coda FIFO esamina i primi 20.000 messaggi per determinare il gruppo di messaggi disponibile. Se i gruppi di messaggi nei primi 20.000 messaggi sono bloccati a causa dei messaggi in transito, i messaggi degli altri gruppi che si trovano dopo i primi 20.000 non verranno restituiti. Per ulteriori informazioni, consulta Avoid having a large backlog of messages with the same group ID.
Esempio A
Una coda FIFO contiene un totale di 20.001 messaggi. I primi 20.000 messaggi appartengono al gruppo di messaggi 1 e l'ultimo messaggio appartiene al gruppo di messaggi 2. Quando si tenta di ricevere messaggi dalla coda, si riceve un messaggio solo dal gruppo 1. Qualsiasi chiamata API ReceiveMessage consecutiva genera messaggi ricevuti vuoti. Ciò accade perché FIFO esamina solo i messaggi che appartengono al gruppo 1 e quel gruppo è bloccato dalla chiamata corrente.
Esempio B
Una coda FIFO contiene un totale di 20.000 messaggi. I primi 19.999 messaggi appartengono al gruppo di messaggi 1 e l'ultimo messaggio appartiene al gruppo di messaggi 2. Quando si tenta di ricevere messaggi dalla coda, la prima chiamata ReceiveMessage riceve un messaggio che appartiene al gruppo 1. La seconda chiamata ReceiveMessage riceve un messaggio che appartiene al gruppo 2. Eventuali chiamate ReceiveMessage aggiuntive generano messaggi ricevuti vuoti perché entrambi i gruppi risultano bloccati dalle chiamate correnti.
Informazioni correlate
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 3 anni fa
- AWS UFFICIALEAggiornata 3 anni fa
- AWS UFFICIALEAggiornata un anno fa