Visibility timeout, DLQ e long polling
Imposterete i visibility timeout per evitare l'elaborazione duplicata dei messaggi, instraderete i messaggi non riusciti verso una dead-letter queue e ridurrete i costi con il long polling.
Visibility timeout, DLQ e long polling è una lezione Cloud & IT Cert Prep gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cloud & IT Cert Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cloud & IT Cert Prep include 4 lezioni in totale.
Il meccanismo del visibility timeout
Quando un consumatore riceve un messaggio da SQS, il messaggio viene nascosto a tutti gli altri consumatori per un periodo chiamato visibility timeout. Durante questo intervallo, il consumatore elabora il messaggio e poi lo elimina. Se il consumatore si arresta in modo anomalo o non termina in tempo, il visibility timeout scade e il messaggio diventa nuovamente visibile, consentendo a un altro consumatore di prelevarlo. Questo è il meccanismo fondamentale alla base della garanzia di consegna almeno una volta di SQS.
Configurazione del visibility timeout
Il visibility timeout predefinito è di 30 secondi. Può essere impostato da 0 secondi fino a 12 ore. Lo imposti in modo che superi comodamente il tempo massimo previsto per l'elaborazione: se l'elaborazione richiede fino a 2 minuti, imposti il timeout su almeno 3-4 minuti. È inoltre possibile modificare il timeout per ogni receipt utilizzando change-message-visibility, una funzione utile quando un consumatore rileva di aver bisogno di più tempo per completare l'elaborazione di uno specifico messaggio.
# Extend visibility timeout for a specific message
aws sqs change-message-visibility \
--queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
--receipt-handle 'AQEBwJnKyrHigUMZj...' \
--visibility-timeout 300Timeout troppo breve o troppo lungo
Impostare il timeout troppo breve fa ricomparire i messaggi prima che il consumatore abbia terminato, causando un'elaborazione duplicata. Impostarlo troppo lungo impedisce a un altro consumatore di prelevare un messaggio se quello originale si arresta senza segnalarlo (ad esempio, in caso di arresto anomalo di un'istanza EC2 senza una chiusura corretta). Il timeout ottimale è leggermente superiore al tempo di elaborazione del 99° percentile, ma abbastanza breve da consentire un recupero rapido dagli errori dei consumatori. Monitori la metrica CloudWatch ApproximateNumberOfMessagesNotVisible per individuare i problemi relativi al timeout.
Spiegazione delle code DLQ
Una Dead-Letter Queue (DLQ) è una coda SQS separata in cui vengono inviati i messaggi dopo un numero configurabile di tentativi di elaborazione falliti (il maxReceiveCount). Quando il numero di ricezioni di un messaggio supera maxReceiveCount, SQS lo sposta automaticamente nella DLQ. Le DLQ impediscono ai messaggi problematici (messaggi che falliscono sempre) di bloccare indefinitamente la coda. I messaggi nella DLQ possono essere esaminati, sottoposti a debug e riprocessati dopo aver corretto il bug di elaborazione.
Configurazione di una coda DLQ
Una DLQ è semplicemente una normale coda SQS (Standard per una coda di origine Standard, FIFO per una coda di origine FIFO). Nella coda di origine si configura la Redrive Policy per specificare quale coda utilizzare come DLQ e la soglia maxReceiveCount. Si assicuri che il periodo di conservazione della DLQ sia più lungo di quello della coda di origine: i messaggi arrivano nella DLQ in ritardo e occorre avere tempo per analizzarli prima che scadano.
aws sqs set-queue-attributes \
--queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
--attributes '{
"RedrivePolicy": "{\"deadLetterTargetArn\": \"arn:aws:sqs:us-east-1:123456789012:MyDLQ\", \"maxReceiveCount\": \"5\"}"
}'Monitoraggio e configurazione degli allarmi DLQ
Imposti un allarme CloudWatch sulla metrica ApproximateNumberOfMessagesVisible della DLQ. Qualsiasi messaggio che arriva nella DLQ indica un errore di elaborazione che richiede attenzione. Configuri l'allarme in modo che attivi una notifica SNS per avvisare immediatamente l'ingegnere reperibile. Consideri ogni messaggio nella DLQ come un bug da analizzare: i messaggi DLQ non devono accumularsi senza essere rilevati. Dopo aver corretto il bug, utilizzi DLQ Redrive per reinviare i messaggi alla coda di origine e rielaborarli.
DLQ Redrive: riproduzione dei messaggi
Dopo aver corretto il bug che ha causato gli errori di elaborazione, utilizzi SQS DLQ Redrive per spostare i messaggi dalla DLQ alla coda di origine e rielaborarli. La console offre una funzione di redrive integrata. È possibile filtrare in base agli attributi dei messaggi per riprodurre solo messaggi specifici. In alternativa, può scrivere una funzione Lambda che esegua il polling della DLQ e inoltri i messaggi alla coda di origine se è necessaria una logica di filtraggio personalizzata.
# Start DLQ message move task
aws sqs start-message-move-task \
--source-arn 'arn:aws:sqs:us-east-1:123456789012:MyDLQ' \
--destination-arn 'arn:aws:sqs:us-east-1:123456789012:MyQueue' \
--max-number-of-messages-per-second 5Short polling e long polling
Per impostazione predefinita, SQS utilizza il short polling: una chiamata receive-message campiona un sottoinsieme casuale di server e restituisce immediatamente una risposta, anche se non sono disponibili messaggi. Questo genera molte risposte vuote e spreca chiamate API. Il long polling attende fino a 20 secondi l'arrivo di un messaggio prima di restituire una risposta vuota. Il long polling riduce significativamente i costi (con meno chiamate API) e la latenza (il messaggio viene ricevuto appena arriva, fino a 20 secondi prima rispetto al ciclo di polling successivo).
Abilitazione del long polling
Abiliti il long polling a livello di coda (si applica a tutte le chiamate di ricezione) oppure per singola richiesta. Per la maggior parte delle applicazioni, è consigliata la configurazione a livello di coda con ReceiveMessageWaitTimeSeconds impostato su 20. Quando Lambda utilizza SQS come origine degli eventi, usa automaticamente il long polling. Per i consumatori basati su EC2, imposti WaitTimeSeconds nella chiamata receive-message.
# Enable long polling at queue level (recommended)
aws sqs set-queue-attributes \
--queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
--attributes '{"ReceiveMessageWaitTimeSeconds": "20"}'
# Or per-request
aws sqs receive-message \
--queue-url 'https://...' \
--wait-time-seconds 20 \
--max-number-of-messages 10Attributi e filtraggio dei messaggi
I messaggi SQS possono contenere attributi del messaggio, ovvero coppie chiave-valore di metadati separate dal corpo del messaggio. Gli attributi hanno un tipo (String, Number, Binary) e un valore. Quando SQS è sottoscritto a un topic SNS, è possibile utilizzare le policy di filtro delle sottoscrizioni SNS applicate agli attributi dei messaggi per instradare solo i messaggi pertinenti a ciascuna coda. Senza filtraggio, ogni sottoscrittore SQS riceve ogni pubblicazione SNS, indipendentemente dal contenuto.
Code di ritardo e timer dei messaggi
Una Delay Queue rende ogni nuovo messaggio invisibile per un periodo di ritardo compreso tra 0 e 15 minuti dopo l'invio. È utile per i workflow in cui un consumatore non deve elaborare immediatamente un messaggio, ad esempio quando deve prima attendere il completamento di un processo dipendente. È inoltre possibile impostare un ritardo per singolo messaggio utilizzando DelaySeconds nella chiamata di invio, sostituendo il ritardo configurato a livello di coda. Nota: le code di ritardo non sono disponibili per le code FIFO.
# Create a delay queue (5 minute delay)
aws sqs create-queue \
--queue-name 'DelayedProcessingQueue' \
--attributes '{"DelaySeconds": "300"}'Controllo rapido
Verifichi la Sua comprensione dei concetti di AWS Solutions Architect (SAA-C03) trattati in questa lezione.
Riepilogo della lezione
In questa lezione ha appreso che: Visibility Timeout nasconde un messaggio agli altri consumer durante l'elaborazione, consentendo una consegna almeno una volta con ridistribuzione automatica se il consumer non riesce a elaborarlo; le Dead-Letter Queues raccolgono i messaggi che continuano a non riuscire per facilitare il debug e il replay dopo la correzione del bug; il Long Polling (con un'attesa fino a 20 secondi) riduce i costi delle API e la latenza rispetto allo short polling. Ora esploreremo gli argomenti SNS e l'architettura fan-out.
Domande Frequenti
La lezione «Visibility timeout, DLQ e long polling» è gratuita?
Sì — il testo completo di «Visibility timeout, DLQ e long polling» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cloud & IT Cert Prep, passa a CoddyKit PRO. Il corso Cloud & IT Cert Prep include 4 lezioni in totale.
Cosa imparerò in «Visibility timeout, DLQ e long polling»?
Imposterete i visibility timeout per evitare l'elaborazione duplicata dei messaggi, instraderete i messaggi non riusciti verso una dead-letter queue e ridurrete i costi con il long polling. Eserciti Cloud & IT Cert Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Cloud & IT Cert Prep?
Non è richiesta alcuna esperienza precedente. Cloud & IT Cert Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Visibility timeout, DLQ e long polling»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Cloud & IT Cert Prep?
Sì. Ogni lezione Cloud & IT Cert Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Code SQS Standard e FIFO
- Visibility timeout, DLQ e long polling
- Topic SNS e architettura fan-out
- Filtraggio dei messaggi SQS e integrazione SNS + SQS