Compartir por


Captura previa de mensajes de Azure Service Bus

Al habilitar la característica Captura previa para cualquiera de los clientes de Service Bus oficiales, el receptor adquiere más mensajes de los que la aplicación solicitó inicialmente, hasta el recuento de captura previa especificado. A medida que los mensajes son devueltos a la aplicación, el cliente adquiere más mensajes en segundo plano, para rellenar el búfer de precarga.

Habilitación de la captura previa

Para habilitar la característica de captura previa, establezca el recuento de captura previa del cliente de cola o suscripción en un número mayor que cero. Si se establece el valor en cero, se desactivará la captura previa.

Establezca la propiedad prefetch count en los objetos ServiceBusReceiverOptions y ServiceBusProcessorOptions.

Nota

El SDK de Javascript no admite la característica Captura previa.

Aunque los mensajes están disponibles en el búfer de captura previa, las llamadas de recepción subsiguientes se realizan directamente desde el búfer. Este se repone en segundo plano a medida que haya espacio disponible. Si no hay ningún mensaje disponible para la entrega, la operación de recepción vacía el búfer y, después, lo espera o bloquea, como esté previsto.

¿Por qué la captura previa no es la opción predeterminada?

La captura previa acelera el flujo de mensajes al hacer que el mensaje esté fácilmente disponible para la recuperación local antes de que la aplicación lo solicite. Esta ganancia de rendimiento es el resultado de una compensación que el autor de la aplicación debe hacer explícitamente.

Cuando usted usa el modo de recibir y eliminar, todos los mensajes que son adquiridos en el buffer de prefetch ya no están disponibles en la cola. Los mensajes permanecen solo en el búfer de captura previa en memoria hasta que se reciben en la aplicación. Si la aplicación finaliza antes de que se reciban los mensajes en la aplicación, estos no se pueden recuperar (se pierden).

Cuando usted usa el modo de recepción peek lock, los mensajes buscados en el buffer prefetch son adquiridos en el buffer en un estado bloqueado. Se selecciona el reloj de tiempo de espera para el bloqueo. Si el búfer de captura previa es grande y el procesamiento tarda tanto tiempo que expiran los bloqueos de ese mensaje mientras permanece en el búfer de captura previa o incluso mientras la aplicación está procesando el mensaje, puede haber algunos eventos confusos que aplicación tenga que controlar. La aplicación podría adquirir un mensaje con un bloqueo que haya expirado o que esté a punto a punto de expirar. Si es así, la aplicación puede procesar el mensaje, pero, después, encuentra que no puede completarlo debido a la expiración de un bloqueo. La aplicación puede comprobar la propiedad LockedUntilUtc (que está sujeta a desfases del reloj entre el reloj del agente y de la máquina local).

Si el bloqueo de mensajes ha expirado, la aplicación debe ignorar el mensaje y no debe realizarse ninguna llamada API en el mensaje. Si el mensaje no ha expirado pero la expiración es inminente, el bloqueo se puede renovar y ampliar durante otro período de bloqueo predeterminado. Si el bloqueo expira en modo silencioso en el búfer de captura previa, el mensaje se trata como abandonado y de nuevo estará disponible para su recuperación desde la cola. Esto podría provocar que el mensaje se capturara en el búfer de captura previa y se colocara al final. Si el búfer de captura previa no se puede trabajar normalmente durante la expiración del mensaje, los mensajes se capturan previamente de forma repetida, pero nunca se entregan de forma eficaz en un estado utilizable (bloqueado válidamente), y, finalmente, se mueven a la cola de mensajes fallidos una vez que se supera el número máximo de entregas.

Si una aplicación abandona explícitamente un mensaje, es posible que el mensaje vuelva a estar disponible para la recuperación de la cola. Cuando la captura previa está habilitada, el mensaje se vuelve a capturar en el búfer de captura previa y se coloca al final. A medida que los mensajes del búfer de captura previa se purgan en el orden primero en salir (FIFO), la aplicación puede recibir mensajes desordenados. Por ejemplo, la aplicación puede recibir un mensaje con el identificador 2 y después un mensaje con el identificador 1 (que fue abandonado anteriormente) desde el buffer.

Si necesita un alto grado de confiabilidad para procesar los mensajes y el procesamiento requiere un trabajo y tiempo considerable, se recomienda usar la característica de captura previa de manera conservadora o no utilizarla en absoluto. Si necesita un elevado rendimiento y el procesamiento de mensajes es normalmente barato, la captura previa aporta ventajas de rendimiento significativas.

El número máximo de captura previa y la duración del bloqueo configurado en la cola o suscripción deben equilibrarse de forma que el tiempo de espera del bloqueo supere al menos el tiempo de procesamiento de mensajes acumulativo para el tamaño máximo del búfer de captura previa, además de un mensaje. Al mismo tiempo, el tiempo de expiración de bloqueo no debe ser tan prolongado que los mensajes superen su período de vida máximo cuando se quitan accidentalmente, lo que requiere que su bloqueo expire antes de que se vaya a volver a entregar.

Pasos siguientes

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

Muestras para las bibliotecas cliente .NET y Java más 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 retiraremos el soporte del protocolo SBMP, por lo que ya no podrás 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.