Panoramica delle code dei messaggi non recapitabili del bus di servizio

Le code del bus di servizio di Azure e le sottoscrizioni dell'argomento includono una coda secondaria chiamata coda di messaggi non recapitabili (DLQ, Dead-Letter Queue). Non è necessario creare in modo esplicito la coda di messaggi non recapitabili, che non può essere eliminata né altrimenti gestita indipendentemente dall'entità principale.

Questo articolo descrive le code dei messaggi non recapitabili nel bus di servizio. Questo argomento viene in gran parte illustrato nell'esempio relativo alle code di messaggi non recapitabili su GitHub.

Coda di messaggi non recapitabili

Lo scopo della coda dei messaggi non recapitabili è conservare i messaggi che non possono essere recapitati ai ricevitori o che non possono essere elaborati. I messaggi possono essere rimossi dalla coda e verificati. Con l'aiuto di un operatore, un'applicazione potrebbe correggere i problemi e inviare nuovamente il messaggio, registrare la notizia che si è verificato un errore e intraprendere azioni correttive.

Dal punto di vista di API e protocolli, la coda DLQ è molto simile a qualsiasi altra coda, ad eccezione del fatto che i messaggi possono essere inviati ad essa solo tramite l'operazione messaggi non recapitabili dell'entità padre. Inoltre, il parametro time-to-live non viene rispettato e non è possibile impostare come non recapitabile un messaggio di una coda DLQ. La coda dei messaggi non recapitabili supporta completamente il recapito con blocco di visualizzazione e le operazioni transazionali.

Non è prevista alcuna pulizia automatica della coda. I messaggi rimangono nella coda di messaggi non recapitabili fino a quando non vengono esplicitamente recuperati e completati.

Numero di messaggi in coda DQL

Non è possibile ottenere il numero di messaggi nella coda dei messaggi non recapitabili a livello di argomento. Questo perché i messaggi non si trovano a livello di argomento. Al contrario, quando un mittente invia un messaggio a un argomento, il messaggio viene inoltrato alle sottoscrizioni per l'argomento nell'arco di millisecondi e quindi non risiede più a livello di argomento. È quindi possibile visualizzare i messaggi in coda DQL associati alla sottoscrizione per l'argomento. Nell'esempio seguente Service Bus Explorer indica che sono presenti 62 messaggi in coda DQL per la sottoscrizione "test1".

Image showing 62 messages in the dead-letter queue.

È anche possibile ottenere il numero di messaggi in coda DQL usando il comando dell'interfaccia della riga di comando di Azure: az servicebus topic subscription show.

Spostare messaggi nella coda DLQ

Nel bus di servizio sono presenti diverse attività che comportano l'inserimento di messaggi nella coda DLQ dall'interno del motore di messaggistica stesso. Un'applicazione può anche spostare in modo esplicito i messaggi nella coda dei messaggi non recapitabili. Le due proprietà seguenti (motivo dei messaggi non recapitabili e descrizione dei messaggi non recapitabili) vengono aggiunte ai messaggi non recapitabili. Le applicazioni possono definire i propri codici per la proprietà reason dei messaggi non recapitabili, ma il sistema imposta i valori seguenti.

Motivo dei messaggi non recapitabili Descrizione dell'errore di messaggi non recapitabili
HeaderSizeExceeded È stata superata la dimensione del flusso.
TTLExpiredException Il messaggio è scaduto ed è stato configurato come non recapitabile. Per informazioni dettagliate, vedere la sezione Durata (TTL ).
L'ID sessione ha valore null. L'entità attivata dalla sessione non consente il recapito di un messaggio il cui identificatore di sessione è null.
MaxTransferHopCountExceeded È stato superato il numero massimo di hop consentiti durante l'inoltro tra le code. Questo valore è impostato su 4.
MaxDeliveryCountExceeded Impossibile utilizzare il messaggio dopo il numero massimo di tentativi di recapito. Per informazioni dettagliate, vedere la sezione Numero massimo di recapito.

Numero massimo di recapito

È previsto un limite al numero di tentativi di recapitare messaggi per le code e le sottoscrizioni di bus di servizio. Il valore predefinito è 10. Ogni volta che un messaggio è stato recapitato in un blocco a comparsa, ma è stato abbandonato in modo esplicito o il blocco è scaduto, il conteggio del recapito sul messaggio viene incrementato. Quando il numero di recapito supera il limite, il messaggio viene spostato nella DQ. Il motivo dei messaggi non recapitabili in DLQ è impostato su: MaxDeliveryCountExceeded. Questo comportamento non può essere disabilitato, ma è possibile impostare il numero massimo di recapito su un numero elevato.

Durata (TTL)

Quando si abilita l'inserimento di messaggi non recapitabili in code o sottoscrizioni, tutti i messaggi in scadenza vengono spostati nella DQ. Il codice motivo dei messaggi non recapitabili è impostato su: TTLExpiredException.

I messaggi posticipati non verranno eliminati e spostati nella coda dei messaggi non recapitabili dopo la scadenza. Questo comportamento dipende dalla progettazione.

Errori durante l'elaborazione di regole di sottoscrizione

Se si abilita l'inserimento di messaggi non recapitabili nelle eccezioni di valutazione del filtro, eventuali errori che si verificano durante l'esecuzione della regola di filtro SQL di una sottoscrizione vengono acquisiti nella DQ insieme al messaggio che causa l'errore. Non usare questa opzione in un ambiente di produzione in cui non tutti i tipi di messaggio hanno sottoscrittori.

Definizione di messaggi non recapitabili a livello di applicazione

Oltre alle funzionalità di definizione dei messaggi non recapitabili del sistema, le applicazioni possono usare la coda DLQ per rifiutare esplicitamente i messaggi inaccettabili. Questi possono riguardare i messaggi che non possono essere elaborati correttamente a causa diversi problemi del sistema, i messaggi contenenti payload in formato non valido o che non superino il processo di autenticazione quando viene utilizzato un schema di sicurezza a livello di messaggio.

A tale scopo, chiamare il metodo ServiceBusReceiver.DeadLetterMessageAsync.

È consigliabile includere il tipo di eccezione nell'oggetto DeadLetterReason e l'analisi dello stack dell'eccezione in DeadLetterDescription , in quanto semplifica la risoluzione della causa del problema con conseguente mancato spostamento dei messaggi. Tenere presente che questo potrebbe comportare il superamento del limite di quota di 256 KB per il livello Standard di bus di servizio di Azure, indicando inoltre che il livello Premium è quello che deve essere usato per gli ambienti di produzione.

Messaggi non recapitabili in scenari di inoltro automatico

I messaggi vengono inviati alla coda dei messaggi non recapitabili nelle condizioni seguenti:

  • Un messaggio passa attraverso più di quattro code o argomenti che sono concatenati.
  • L'argomento o la coda di destinazione è disattivato o eliminato.
  • L'argomento o la coda di destinazione supera le dimensioni massime dell'entità.

Invio di messaggi non recapitabili tramite scenari

  • Se la coda o l'argomento di destinazione è disabilitata, il messaggio viene inviato a una coda di messaggi non recapitabili (TDLQ) di trasferimento della coda di origine.
  • Se la coda o l'argomento di destinazione viene eliminata, viene generata l'eccezione 404.
  • Se la coda o l'entità di destinazione supera le dimensioni dell'entità, il messaggio viene inviato a un TDLQ della coda di origine.

Percorso della coda di messaggi non recapitabili

È possibile accedere alla coda dei messaggi non recapitabili utilizzando la sintassi seguente:

<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue

Invio di messaggi non recapitabili da rielaborare

Poiché possono essere presenti dati aziendali preziosi nei messaggi che sono finiti nella coda dei messaggi non recapitabili, è consigliabile rielaborare tali messaggi quando gli operatori hanno terminato di gestire le circostanze che hanno causato la ricezione di messaggi non recapitabili al primo posto.

Strumenti come bus di servizio di Azure Explorer consentono lo spostamento manuale dei messaggi tra code e argomenti. Se sono presenti molti messaggi nella coda di messaggi non recapitabili che devono essere spostati, il codice simile a questo può essere utile per spostarli tutti contemporaneamente. Gli operatori preferiscono spesso disporre di un'interfaccia utente in modo che possano risolvere i problemi di elaborazione dei tipi di messaggio non riusciti, da cui le code di origine e per quali motivi, pur essendo ancora in grado di inviare di nuovo batch di messaggi da rielaborare. Strumenti come ServicePulse con NServiceBus offrono queste funzionalità.

Passaggi successivi

Per informazioni su diversi modi di configurare l'invio di messaggi non recapitabili all'impostazione di scadenza del messaggio, vedere Abilitare messaggi non recapitabili per una coda o una sottoscrizione.