Condividi tramite


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. Un'applicazione potrebbe consentire a un utente di correggere i problemi e inviare nuovamente il messaggio.

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 le normali operazioni, ad esempio il recapito tramite peek-lock, la ricezione e l'eliminazione 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.

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

In .NET è possibile utilizzare il metodo FormatDeadLetterPath.

QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)

Numero di messaggi in coda DQL

L'acquisizione del numero di messaggi nella coda dei messaggi non recapitabili a livello di argomento non è applicabile 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".

Immagine che mostra 62 messaggi nella coda dei messaggi non recapitabili.

È 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à sul motivo dell'inserimento nei messaggi non recapitabili; tuttavia, il sistema imposta i valori seguenti.

Motivo dell'inserimento nella coda di messaggi non recapitabili Descrizione dell'errore di inserimento nella coda di messaggi non recapitabili
HeaderSizeExceeded La quota di dimensioni per questo flusso ha superato il limite.
TTLExpiredException Il messaggio è scaduto ed è stato configurato come non recapitabile. Per informazioni dettagliate, vedere la sezione TTL.
Session ID is null. L'entità attivata dalla sessione non consente il recapito di un messaggio il cui identificatore di sessione è null.
MaxTransferHopCountExceeded Superato il limite massimo di hop consentiti durante l'inoltro tra le code. Questo valore è impostato su 4.
MaxDeliveryCountExceeded Il messaggio non può essere utilizzato dopo il numero massimo di tentativi di recapito. Per informazioni dettagliate, vedere la sezione Numero massimo di recapito.

Durata (TTL)

Quando si abilita l'inserimento di messaggi non recapitabili in code o sottoscrizioni, tutti i messaggi in scadenza vengono spostati nella DLQ. 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 è impostato a livello di progettazione.

Conteggio distribuzione massimo

È previsto un limite al numero di tentativi di recapito dei messaggi per le code e le sottoscrizioni del Bus di servizio. Il valore predefinito è 10. Ogni volta che un messaggio viene recapitato in un blocco a comparsa, ma viene 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 DLQ. Il motivo dei messaggi non recapitabili in DLQ è impostato su: MaxDeliveryCountExceeded. Non è possibile disattivare questo comportamento, ma è possibile impostare il numero massimo di consegne su un numero elevato.

Errori durante l'elaborazione di regole di sottoscrizione

Se si abilita l'inserimento nei 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 DLQ insieme al messaggio che causa l'errore. Non usare questa opzione in un ambiente di produzione in cui sono presenti tipi di messaggio inviati all'argomento, che non dispongono di sottoscrittori, in quanto ciò può comportare un carico elevato di messaggi DLQ. Di conseguenza, assicurarsi che tutti i messaggi inviati all'argomento dispongano di almeno una sottoscrizione corrispondente.

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.

In .NET è possibile chiamare il metodo ServiceBusReceiver.DeadLetterMessageAsync.

È consigliabile includere il tipo di eccezione in DeadLetterReason e l'analisi dello stack dell'eccezione in DeadLetterDescription, in quanto semplifica la risoluzione della causa del problema con conseguente mancato inserimento nei messaggi non recapitabili. Tenere presente che potrebbero verificarsi alcuni messaggi che superano il limite di quota di 256 KB per il livello Standard del Bus di servizio di Azure. È possibile aggiornare lo spazio dei nomi del Bus di servizio dal livello standard a quello Premium per avere quote e limiti più elevati.

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 alla coda di messaggi non recapitabili (TDLQ) di trasferimento della coda di origine.
  • Se la coda o l'entità di destinazione supera le dimensioni dell'entità, il messaggio viene inviato a un TDLQ della coda di origine.

Invio di messaggi non recapitabili da rielaborare

Dopo aver risolto il problema che causava il mancato recapito del messaggio, è possibile inviarlo nuovamente alla coda o all'argomento da rielaborare.

Strumenti come Azure Service Bus 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, un codice come questo può essere utile per spostarli tutti contemporaneamente. Gli operatori spesso preferiscono avere un'interfaccia utente in modo da poter 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à.

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