Detección de duplicados

Si una aplicación deja de funcionar debido a un error grave inmediatamente después de enviar un mensaje y la instancia de la aplicación reiniciada cree erróneamente que la entrega del mensaje anterior no se ha producido, un posterior envío hace que el mismo mensaje aparezca en el sistema dos veces.

También puede producirse un error en el nivel de cliente o de red un momento antes y que un mensaje enviado se confirme en la cola, sin que la confirmación se devuelva al cliente correctamente. Este escenario deja al cliente en duda sobre el resultado de la operación de envío.

La detección de duplicados elimina la duda en estas situaciones, ya que permite al remitente reenviar el mismo mensaje, y la cola o el tema descartan las copias duplicadas.

Nota

El nivel Básico de Service Bus no admite la detección de duplicados. Los niveles Estándar y Premium admiten la detección de duplicados. Para conocer las diferencias entre estos niveles, consulte Precios de Service Bus.

Cómo funciona

Habilitar la detección de duplicados permite supervisar el identificador MessageId controlado por la aplicación para todos los mensajes enviados a una cola o un tema durante una ventana de tiempo específica. Si se envía algún mensaje nuevo con MessageId que se haya registrado durante el periodo de tiempo, se notifica como aceptado (la operación de envío se realiza correctamente), pero el mensaje recién enviado se ignora y descarta al instante. No se tiene en cuenta ninguna otra parte del mensaje, además del identificador MessageId.

El control de aplicación del identificador es esencial, ya que es lo único que permite que la aplicación enlace el valor MessageId a un contexto de proceso empresarial desde el que se pueda reconstruir de manera predecible en caso de error.

En el caso de un proceso empresarial en el que se envían varios mensajes en el transcurso del control de algún contexto de aplicación, el valor MessageId puede constar del identificador de contexto de nivel de aplicación, como un número de orden de compra, y el asunto del mensaje, por ejemplo, 12345.2017/payment.

El valor MessageId siempre puede ser algún GUID, pero el anclaje del identificador al proceso de negocio produce una capacidad de repetición predecible, lo que resulta conveniente para usar con efectividad la característica de detección de duplicados.

Importante

  • Cuando la creación de particiones está habilitada, MessageId+PartitionKey se usa para determinar la unicidad. Cuando se habilitan las sesiones, la clave de partición y el identificador de sesión deben ser iguales.
  • Cuando la creación de particiones está deshabilitada (valor predeterminado), solo se usa MessageId para determinar la unicidad.
  • Para obtener información sobre SessionId, PartitionKey y MessageId, vea Uso de claves de partición.

Nota

Los mensajes programados se incluyen en la detección de duplicados. Por lo tanto, si envía un mensaje programado y, a continuación, envía un mensaje no programado duplicado, se quita el mensaje no programado. Del mismo modo, si envía un mensaje no programado y, a continuación, un mensaje programado duplicado, se quita el mensaje programado.

Tamaño de la ventana de detección de duplicados

Además de habilitar la detección de duplicados, también puede configurar el tamaño de la ventana de tiempo del historial de detección de duplicados durante la cual se retienen los id. de mensaje. Este valor predeterminado es de 10 minutos para colas y temas, con un valor mínimo de 20 segundos y un valor máximo de 7 días.

La habilitación de la detección de duplicados y el tamaño de la ventana afecta directamente al rendimiento de la cola (y del tema), dado que todos los identificadores de mensaje registrados deben coincidir con el identificador de mensaje recién enviado.

Mantener la ventana pequeña significa que menos identificadores de mensaje se deben conservar y coincidir, y el rendimiento resulta afectado en un menor grado. En las entidades de alto rendimiento que requieren la detección de duplicados, debe mantener la ventana lo más pequeña posible.

Pasos siguientes

Puede habilitar la detección de mensajes duplicados mediante Azure Portal, PowerShell, CLI, la plantilla de Resource Manager, .NET, Java, Python y JavaScript. Para obtener más información, consulte Habilitar la detección de mensajes duplicados.

En escenarios en los que el código de cliente no puede volver a enviar un mensaje con el mismo valor MessageId que antes, es importante diseñar mensajes que se puedan volver a procesar de forma segura. En esta entrada de blog sobre idempotencia se describen diversas técnicas de cómo hacerlo.

Pruebe los ejemplos en el lenguaje que prefiera para explorar las características de Azure Service Bus.

Aquí puede ver ejemplos de las bibliotecas cliente de .NET y Java anteriores:

El 30 de septiembre de 2026, retiraremos las bibliotecas del SDK de Azure Service Bus WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus y com.microsoft.azure.servicebus, que no se ajustan a las directrices del SDK de Azure. También finalizaremos la compatibilidad con el protocolo SBMP, por lo que ya no podrá usar este protocolo después del 30 de septiembre de 2026. Migre a las bibliotecas más recientes del SDK de Azure, que ofrecen actualizaciones de seguridad críticas y funcionalidades mejoradas, antes de esa fecha.

Aunque las bibliotecas anteriores todavía se pueden usar después del 30 de septiembre de 2026, ya no recibirán soporte técnico oficial ni actualizaciones de Microsoft. Para obtener más información, consulte el anuncio de retirada de soporte técnico.