Partilhar via


Visão geral das filas de cartas mortas do Service Bus

As filas do Barramento de Serviço do Azure e as assinaturas de tópicos fornecem uma subfila secundária, chamada de fila de letras mortas (DLQ). A fila de mensagens não entregues não precisa de ser criada explicitamente e não pode ser eliminada nem gerida independentemente da entidade principal.

Este artigo descreve filas de letra morta no Service Bus. Grande parte da discussão é ilustrada pelo exemplo de filas Dead-Letter no GitHub.

A fila de cartas mortas

O objetivo da fila de mensagens mortas é armazenar mensagens que não podem ser entregues a nenhum destinatário ou mensagens que não podem ser processadas. As mensagens podem ser removidas do DLQ e inspecionadas. Um aplicativo pode permitir que um usuário corrija problemas e reenvie a mensagem.

De uma perspetiva de API e protocolo, o DLQ é basicamente semelhante a qualquer outra fila, exceto que as mensagens só podem ser enviadas por meio da operação de letra morta da entidade pai. Além disso, o tempo de vida não é observado e você não pode escrever uma mensagem de um DLQ. A fila de mensagens mortas suporta totalmente operações normais, como entrega peek-lock, recebimento e exclusão e operações transacionais.

Não existe limpeza automática da DLQ. As mensagens permanecem na DLQ até que as obtenha explicitamente da DLQ e conclua a mensagem não entregue.

Caminho para a fila de mensagens mortas

Você pode acessar a fila de mensagens mortas usando a seguinte sintaxe:

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

No .NET, você pode usar o FormatDeadLetterPath método.

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

Contagem de mensagens DLQ

A obtenção da contagem de mensagens na fila de mensagens mortas no nível do tópico não é aplicável porque as mensagens não ficam no nível do tópico. Em vez disso, quando um remetente envia uma mensagem para um tópico, a mensagem é encaminhada para assinaturas para o tópico em milissegundos e, portanto, não reside mais no nível do tópico. Assim, você pode ver mensagens no DLQ associado à assinatura do tópico. No exemplo a seguir, o Service Bus Explorer mostra que há 62 mensagens atualmente no DLQ para a assinatura "test1".

Imagem mostrando 62 mensagens na fila de mensagens mortas.

Você também pode obter a contagem de mensagens DLQ usando o comando da CLI do Azure: az servicebus topic subscription show.

Movendo mensagens para o DLQ

Há várias atividades no Service Bus que fazem com que as mensagens sejam enviadas para o DLQ de dentro do próprio mecanismo de mensagens. Um aplicativo também pode mover mensagens explicitamente para o DLQ. As duas propriedades a seguir (razão da letra morta e descrição da letra morta) são adicionadas às mensagens com letra morta. Os aplicativos podem definir seus próprios códigos para a propriedade dead-letter reason, mas o sistema define os seguintes valores.

Motivo da letra morta Descrição do erro de letra morta
HeaderSizeExceeded A cota de tamanho para esse fluxo excedeu o limite.
TTLExpiredException A mensagem expirou e foi classificada como não entregue. Consulte a seção Tempo de vida para obter detalhes.
Session ID is null. A entidade com sessão ativada não permite uma mensagem cujo identificador de sessão seja nulo.
MaxTransferHopCountExceeded O número máximo de saltos permitidos ao encaminhar entre filas excedeu o limite. Esse valor é definido como 4.
MaxDeliveryCountExceeded A mensagem não pôde ser consumida após o máximo de tentativas de entrega. Consulte a seção Contagem máxima de entregas para obter detalhes.

Time to live

Quando você habilita o lettering morto em filas ou assinaturas, todas as mensagens que expiram são movidas para o DLQ. O código de razão da letra morta é definido como: TTLExpiredException. As mensagens adiadas não serão limpas e movidas para a fila de mensagens mortas depois de expirarem. Este comportamento é a predefinição.

Contagem máxima de entregas

Há um limite no número de tentativas de entregar mensagens para filas e assinaturas do Service Bus. O valor predefinido é 10. Sempre que uma mensagem é entregue sob um bloqueio de espiada, mas é explicitamente abandonada ou o bloqueio expirou, a contagem de entrega na mensagem é incrementada. Quando a contagem de entrega excede o limite, a mensagem é movida para o DLQ. O motivo da letra morta para a mensagem no DLQ está definido como: MaxDeliveryCountExceeded. Esse comportamento não pode ser desativado, mas você pode definir a contagem máxima de entrega para um grande número.

Erros ao processar regras de subscrição

Se você habilitar o lettering morto em exceções de avaliação de filtro, quaisquer erros que ocorram enquanto a regra de filtro SQL de uma assinatura é executada serão capturados no DLQ junto com a mensagem ofensiva. Não use essa opção em um ambiente de produção onde você tem tipos de mensagem que são enviados para o tópico, que não têm assinantes, pois isso pode resultar em uma grande carga de mensagens DLQ. Como tal, certifique-se de que todas as mensagens enviadas para o tópico têm pelo menos uma assinatura correspondente.

Letras mortas no nível do aplicativo

Além dos recursos de letras mortas fornecidos pelo sistema, os aplicativos podem usar o DLQ para rejeitar explicitamente mensagens inaceitáveis. Eles podem incluir mensagens que não podem ser processadas corretamente devido a qualquer tipo de problema no sistema, mensagens que contêm cargas malformadas ou mensagens que falham na autenticação quando algum esquema de segurança no nível da mensagem é usado.

No .NET, isso pode ser feito chamando o método ServiceBusReceiver.DeadLetterMessageAsync.

Recomendamos que você inclua o tipo da exceção no DeadLetterReason e o rastreamento de pilha da exceção no DeadLetterDescription pois facilita a solução de problemas da causa do problema, resultando em mensagens com letras mortas. Lembre-se de que isso pode resultar em algumas mensagens excedendo o limite de cota de 256 KB para a Camada Padrão do Barramento de Serviço do Azure. Você pode atualizar seu namespace do Service Bus da camada padrão para a camada premium para ter cotas e limites mais altos.

Dead-lettering em cenários de encaminhamento automático

As mensagens são enviadas para a fila de mensagens mortas nas seguintes condições:

  • Uma mensagem passa por mais de quatro filas ou tópicos que estão encadeados.
  • A fila ou tópico de destino está desativado ou excluído.
  • A fila ou tópico de destino excede o tamanho máximo da entidade.

Dead-lettering em cenários de envio via

  • Se a fila ou tópico de destino estiver desabilitado, a mensagem será enviada para a fila de transferência de letra morta (TDLQ) da fila de origem.
  • Se a fila ou entidade de destino exceder o tamanho da entidade, a mensagem será enviada para um TDLQ da fila de origem.

Envio de mensagens com letras mortas para serem reprocessadas

Depois de resolver o problema que causou a letra morta, você pode reenviá-la para a fila ou tópico a ser reprocessado.

Ferramentas como o Azure Service Bus Explorer permitem a movimentação manual de mensagens entre filas e tópicos. Se houver muitas mensagens na fila de mensagens mortas que precisam ser movidas, um código como esse pode ajudar a movê-las todas de uma vez. Os operadores geralmente preferem ter uma interface de usuário para que possam solucionar problemas de quais tipos de mensagem falharam no processamento, de quais filas de origem e por quais motivos, enquanto ainda podem reenviar lotes de mensagens a serem reprocessadas. Ferramentas como o ServicePulse com NServiceBus fornecem esses recursos.

Consulte Habilitar letras inativas para uma fila ou assinatura para saber mais sobre as diferentes maneiras de configurar as letras inativas na configuração de expiração da mensagem.