Detecção de duplicados

Se um aplicativo falhar devido a um erro fatal imediatamente após enviar uma mensagem e a instância do aplicativo reiniciado acreditar erroneamente que a entrega de mensagem anterior não ocorreu, um envio subsequente fará com que a mesma mensagem apareça no sistema duas vezes.

Também é possível que um erro no nível do cliente ou da rede ocorra um momento antes e que uma mensagem enviada seja confirmada na fila, com a confirmação não sendo retornada com êxito ao cliente. Este cenário deixa o cliente em dúvida sobre o resultado da operação de envio.

A deteção de duplicados elimina a dúvida dessas situações, permitindo que o remetente reenvie a mesma mensagem e a fila ou tópico descarta quaisquer cópias duplicadas.

Nota

A camada básica do Service Bus não oferece suporte à deteção de duplicados. Os escalões standard e premium suportam a deteção de duplicados. Para conhecer as diferenças entre esses níveis, consulte Preços do Service Bus.

Como funciona

Permitir a deteção de duplicados ajuda a monitorizar o MessageId controlado pela aplicação de todas as mensagens enviadas para uma fila ou tópico durante uma janela de tempo especificada. Se alguma nova mensagem for enviada com MessageId o registro durante a janela de tempo, a mensagem será relatada como aceita (a operação de envio será bem-sucedida), mas a mensagem recém-enviada será instantaneamente ignorada e descartada. Não são consideradas outras partes da mensagem que não o MessageId.

O controle do aplicativo do identificador é essencial, pois somente isso permite que o aplicativo vincule o MessageId a um contexto de processo de negócios a partir do qual ele pode ser reconstruído de forma previsível quando ocorre uma falha.

Para um processo de negócios no qual várias mensagens são enviadas durante o tratamento de algum contexto de aplicativo, o MessageId pode ser uma composição do identificador de contexto no nível do aplicativo, como um número de ordem de compra, e o assunto da mensagem, por exemplo, 12345.2017/payment.

O MessageId sempre pode ser algum GUID, mas ancorar o identificador ao processo de negócios produz repetibilidade previsível, o que é desejado para usar o recurso de deteção de duplicados de forma eficaz.

Importante

  • Quando o particionamento está habilitado, MessageId+PartitionKey é usado para determinar a exclusividade. Quando as sessões estão habilitadas, a chave de partição e o ID da sessão devem ser os mesmos.
  • Quando o particionamento está desativado (padrão), só MessageId é usado para determinar a exclusividade.
  • Para obter informações sobre SessionId, e MessageId, PartitionKeyconsulte Uso de chaves de partição.

Nota

As mensagens agendadas são incluídas na deteção de duplicados. Portanto, se você enviar uma mensagem agendada e, em seguida, enviar uma mensagem não agendada duplicada, a mensagem não agendada será descartada. Da mesma forma, se você enviar uma mensagem não agendada e, em seguida, uma mensagem agendada duplicada, a mensagem agendada será descartada.

Tamanho da janela de deteção de duplicados

Além de apenas habilitar a deteção de duplicados, você também pode configurar o tamanho da janela de tempo do histórico de deteção de duplicados durante a qual os IDs de mensagem são mantidos. O padrão desse valor é de 10 minutos para filas e tópicos, com um valor mínimo de 20 segundos até o valor máximo de 7 dias.

Habilitar a deteção de duplicados e o tamanho da janela afetam diretamente a taxa de transferência da fila (e do tópico), já que todos os IDs de mensagem gravados devem ser comparados com o identificador de mensagem recém-enviado.

Manter a janela pequena significa que menos IDs de mensagem devem ser retidos e correspondidos, e a taxa de transferência é menos afetada. Para entidades de alta taxa de transferência que exigem deteção de duplicatas, você deve manter a janela o menor possível.

Próximos passos

Você pode habilitar a deteção de mensagens duplicadas usando o portal do Azure, PowerShell, CLI, modelo do Gerenciador de Recursos, .NET, Java, Python e JavaScript. Para obter mais informações, consulte Habilitar deteção de mensagens duplicadas.

Em cenários em que o código do cliente não consegue reenviar uma mensagem com o mesmo MessageId de antes, é importante criar mensagens que possam ser reprocessadas com segurança. Este post no blog sobre idempotência descreve várias técnicas de como fazer isso.

Experimente os exemplos no idioma de sua escolha para explorar os recursos do Barramento de Serviço do Azure.

Veja exemplos para as bibliotecas de cliente .NET e Java mais antigas aqui:

Em 30 de setembro de 2026, desativaremos as bibliotecas do SDK do Barramento de Serviço do Azure WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus e com.microsoft.azure.servicebus, que não estão em conformidade com as diretrizes do SDK do Azure. Também encerraremos o suporte ao protocolo SBMP, para que você não possa mais usar esse protocolo após 30 de setembro de 2026. Migre para as bibliotecas mais recentes do SDK do Azure, que oferecem atualizações de segurança críticas e recursos aprimorados, antes dessa data.

Embora as bibliotecas mais antigas ainda possam ser usadas após 30 de setembro de 2026, elas não receberão mais suporte e atualizações oficiais da Microsoft. Para obter mais informações, consulte o anúncio de aposentadoria de suporte.