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 então ser removidas do DLQ e inspecionadas. Um aplicativo pode, com a ajuda de um operador, corrigir problemas e reenviar a mensagem, registrar o fato de que houve um erro e tomar medidas corretivas.

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 a entrega com bloqueio de espiada 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.

Contagem de mensagens DLQ

Não é possível obter a contagem de mensagens na fila de mensagens mortas no nível do tópico. Isso 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".

Image showing 62 messages in the dead-letter queue.

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 quota de tamanho deste fluxo foi excedida.
TTLExpiredException A mensagem expirou e foi classificada como não entregue. Consulte a seção Tempo de vida para obter detalhes.
A ID da sessão é nula. 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 foi excedido. 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.

Contagem máxima de entregas

Há um limite no número de tentativas de entrega de mensagens para filas e assinaturas do Service Bus. O valor predefinido é 10. Sempre que uma mensagem foi entregue sob um bloqueio de espiada, mas foi 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.

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 é propositado.

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 no qual nem todos os tipos de mensagem tenham assinantes.

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.

Isso pode ser feito chamando o método ServiceBusReceiver.DeadLetterMessageAsync.

Recomendamos que você inclua o tipo da exceção no e o rastreamento de pilha da exceção no DeadLetterReasonDeadLetterDescription 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 Standard do Barramento de Serviço do Azure, indicando ainda que a Camada Premium é o que deve ser usado para ambientes de produção.

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 uma fila de transferência de letra morta (TDLQ) da fila de origem.
  • Se a fila ou tópico de destino for excluído, a exceção 404 será gerada.
  • Se a fila ou entidade de destino exceder o tamanho da entidade, a mensagem será enviada para um TDLQ da fila de origem.

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

Envio de mensagens com letras mortas para serem reprocessadas

Como pode haver dados comerciais valiosos em mensagens que acabaram na fila de mensagens mortas, é desejável que essas mensagens sejam reprocessadas quando os operadores terminarem de lidar com as circunstâncias que fizeram com que as mensagens fossem mortas em primeiro lugar.

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 este 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.

Próximos passos

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.