Secuenciación y marcas de tiempo de los mensajes
La secuenciación y las marcas de tiempo son dos características que siempre están habilitadas en todas las entidades y la superficie de Service Bus mediante las propiedades SequenceNumber
y EnqueuedTimeUtc
de los mensajes recibidos o examinados.
En aquellos casos en los que sea importante el orden absoluto de los mensajes o en los que un consumidor necesite un identificador único de confianza para los mensajes, el agente marca los mensajes con un número de secuencia creciente, sin espacios, relativo a la cola o el tema. Para las entidades con particiones, el número de secuencia se emite con respecto a la partición.
Número de secuencia
El valor SequenceNumber
es un entero de 64 bits único asignado a un mensaje, que el agente acepta y almacena y funciona como su identificador interno. Para entidades con particiones, los 16 bits superiores reflejan el identificador de la partición. Los números de secuencia pasan a cero cuando se agota el intervalo de 64 o 48 bits (excepto 16 bits para el identificador de partición).
El número de secuencia se puede considerar un identificador único de confianza ya que lo asigna una autoridad central y neutral, y no los clientes. También representa el verdadero orden de llegada y es más preciso como criterio de orden que una marca de tiempo, porque las marcas de tiempo no pueden tener una resolución lo suficientemente alta a velocidades de mensaje extremas y pueden estar sujetas a sesgos de reloj (no obstante, mínimos) en situaciones donde la propiedad del agente pasa de un nodo a otro.
El orden de llegada absoluto importa, por ejemplo, en escenarios empresariales en los que se sirve un número limitado de mercancías por orden de llegada mientras duran los suministros; la venta de entradas para conciertos es un ejemplo.
Marca de tiempo
La funcionalidad de marca de tiempo actúa como autoridad neutral y de confianza que captura de forma precisa la hora UTC de llegada de un mensaje, reflejada en la propiedad EnqueuedTimeUtc
. El valor es útil si un escenario empresarial depende de fechas límite, por ejemplo, si un elemento de trabajo se envió en una fecha determinada antes de medianoche, pero el procesamiento está muy por detrás del trabajo pendiente de la cola.
Nota:
El número de secuencia por sí solo garantiza el orden de puesta en cola y el orden de extracción de los mensajes, pero no el orden de procesamiento, para el que se requieren sesiones.
Supongamos que hay 5 mensajes en la cola y 2 consumidores. El consumidor 1 selecciona el mensaje 1. El consumidor 2 selecciona el mensaje 2. El consumidor 2 termina de procesar el mensaje 2 y selecciona el mensaje 3, mientras que el consumidor 1 aún no ha terminado con el procesamiento del mensaje 1. El consumidor 2 termina de procesar el mensaje 3 pero el consumidor 1 aún no ha terminado con el procesamiento del mensaje 1. Por último, el consumidor 1 completa el procesamiento del mensaje 1. Por lo tanto, los mensajes se procesan en este orden: mensaje 2, mensaje 3 y mensaje 1. Si necesita que los mensajes 1, 2 y 3 se procesen en orden, debe usar sesiones.
Por lo tanto, si solo necesita que los mensajes se recuperen en orden, no es necesario usar sesiones. Pero si los mensajes deben procesarse en orden, use sesiones. El mismo identificador de sesión debe establecerse en los mensajes que van juntos, que podrían ser los mensajes 1, 4 y 8 de un conjunto, y 2, 3 y 6 de otro conjunto.
Para más información, consulte Sesiones de mensajes de Service Bus.
Mensajes programados
Puede enviar mensajes a una cola o tema para su procesamiento retrasado; por ejemplo, para programar un trabajo de forma que esté disponible para que lo procese el sistema a una hora determinada. Esta funcionalidad logra un programador basado en el tiempo distribuido confiable.
Los mensajes programados no se materializan en la cola hasta la hora de puesta en cola definida. Antes de esa hora, pueden cancelarse. La cancelación elimina el mensaje.
Puede programar mensajes mediante cualquiera de nuestros clientes de dos maneras:
- Use la API de envío normal, pero establezca la propiedad
ScheduledEnqueueTimeUtc
en el mensaje antes de enviarlo. - Use la API de programación de mensajes y pase el mensaje normal y la hora programada. Esta API devuelve el valor de
SequenceNumber
del mensaje programado, que luego puede usarse para cancelar dicho mensaje si es necesario.
Los mensajes programados y sus números de secuencia también se pueden detectar mediante la exploración de mensajes.
El valor de SequenceNumber
para un mensaje programado solo es válido mientras el mensaje está en estado planificado. A medida que el mensaje pasa al estado activo, se anexa a la cola como si se hubiera puesto en cola en el instante actual, lo que incluye asignar un nuevo SequenceNumber
.
Como la característica está anclada en mensajes individuales y los mensajes solo pueden ponerse en cola una vez, Service Bus no admite las programaciones recurrentes de los mensajes.
Nota:
- El tiempo de puesta en cola del mensaje no significa que el mensaje se envíe al mismo tiempo. Se pondrá en cola, pero el momento de envío real depende de la carga de trabajo de la cola y su estado.
- Debido a consideraciones de rendimiento, la activación y cancelación de mensajes programados son operaciones independientes sin bloqueo mutuo. Si un mensaje está en proceso de activación y se cancela simultáneamente, el proceso de activación no se revertirá y el mensaje se seguirá activando. Además, esto puede provocar un recuento negativo de mensajes programados. Para minimizar esta condición de carrera, se recomienda evitar programar operaciones de activación y cancelación en sucesión cercana.
Uso de mensajes programados con flujos de trabajo
Es habitual ver flujos de trabajo empresariales de ejecución prolongada que tienen un componente de tiempo explícito para ellos, como tiempos de espera de 5 minutos para la autenticación en dos fases, tiempos de espera de horas para los usuarios que confirman su dirección de correo electrónico y componentes de tiempo de varios días, semanas o meses en dominios como la banca y el seguro.
Estos flujos de trabajo suelen iniciarse mediante el procesamiento de algún mensaje, que luego almacena algún estado y, a continuación, programa un mensaje para continuar el proceso más adelante. Los marcos como NServiceBus y MassTransit facilitan la integración de todos estos elementos.
Contenido relacionado
Para más información sobre la mensajería de Service Bus, consulte los siguientes temas: