Los mensajes programados se entregan a los consumidores en un momento específico en lugar de hacerlo de inmediato. Úselos para crear activadores basados en tiempo en aplicaciones distribuidas, como la cancelación de pedidos por tiempo de espera agotado, notificaciones diferidas o la programación de tareas periódicas.
Los mensajes programados y los mensajes diferidos funcionan de la misma manera: el broker retiene ambos y los entrega en una marca de tiempo específica. El término "mensajes programados" que se usa a continuación abarca ambos tipos.
Antes de empezar
Antes de enviar mensajes programados, asegúrese de que:
El topic tenga su MessageType configurado como
Delay. Los mensajes programados solo pueden enviarse a topics de tipo Delay.La marca de tiempo de entrega sea posterior a la hora actual. Si la marca de tiempo corresponde al pasado o excede el rango permitido, el broker entrega el mensaje de inmediato.
-
La marca de tiempo de entrega se encuentre dentro de la ventana máxima de programación para su tipo de instancia:
Tipo de instancia
Ventana máxima de programación
Standard Edition (suscripción, pay-as-you-go o serverless) y Professional Edition serverless
7 días
Professional Edition y Enterprise Platinum Edition (suscripción o pay-as-you-go)
40 días
Casos de uso
Programación de tareas distribuidas
Programe mensajes con diferentes niveles de granularidad temporal para reemplazar los temporizadores tradicionales basados en bases de datos. Por ejemplo, active una tarea de limpieza de archivos diariamente a una hora fija o envíe una notificación de recordatorio cada 2 minutos. Los mensajes programados eliminan la complejidad de gestionar trabajos cron distribuidos y ofrecen mayor escalabilidad.

Gestión de tiempos de espera de tareas
Difiera una acción hasta que se cumpla un plazo límite. Por ejemplo, en comercio electrónico, cancele un pedido no pagado 30 minutos después de su creación en lugar de consultar repetidamente una base de datos para verificar el estado del pago.

En comparación con la consulta repetida de registros expirados en una base de datos, los mensajes programados ofrecen:
Granularidad temporal flexible: active tareas en cualquier intervalo, sin incrementos de tiempo fijos ni necesidad de lógica de deduplicación.
Mayor rendimiento: evite los cuellos de botella que generan los escaneos frecuentes de la base de datos. La infraestructura de mensajería gestiona la concurrencia y escala horizontalmente.
Funcionamiento de la programación
Marca de tiempo de entrega
La hora de entrega se expresa como una marca de tiempo Unix en milisegundos. Establézcala en el mensaje mediante setDeliveryTimestamp(). El broker retiene el mensaje hasta que se alcanza dicha marca de tiempo.
Para mensajes programados, calcule la hora absoluta de entrega: si la hora actual es
2022-06-09 17:30:00y desea la entrega a las19:20:00, establezca la marca de tiempo en1654773600000.Para mensajes diferidos, agregue un desplazamiento relativo a la hora actual: si la hora actual es
2022-06-09 17:30:00y desea la entrega después de 1 hora, establezca la marca de tiempo en1654770600000.
La marca de tiempo de entrega no puede modificarse ni cancelarse después de enviar el mensaje.
Ciclo de vida del mensaje
Un mensaje programado pasa por seis etapas desde su producción hasta su eliminación:

|
Etapa |
Descripción |
|
Inicialización |
El productor construye el mensaje y lo envía al broker. |
|
Programado |
El broker almacena el mensaje en un sistema de almacenamiento basado en tiempo. Aún no se crea ningún índice visible para el consumidor. |
|
Listo para consumo |
Al llegar la marca de tiempo de entrega, el mensaje se traslada al motor de almacenamiento habitual y se vuelve visible para los consumidores. |
|
En consumo |
Un consumidor recibe y procesa el mensaje. Si no llega un acuse de recibo dentro del tiempo de espera, el broker reintenta la entrega. Para más información, consulte Consumption retry. |
|
Confirmado |
El consumidor confirma la recepción del mensaje. El broker lo marca como consumido, pero no lo elimina de inmediato. |
|
Eliminado |
El broker elimina el mensaje de forma rotativa cuando expira el periodo de retención o queda poco espacio de almacenamiento. Hasta su eliminación, el mensaje puede volver a consumirse. Para más información, consulte Message storage and cleanup. |
Límites
|
Restricción |
Detalle |
|
Tipo de topic |
Solo los topics con MessageType configurado como |
|
Precisión temporal |
Exactitud en milisegundos. La granularidad predeterminada es de 1,000 ms. |
|
Persistencia |
Los mensajes programados sobreviven a los reinicios del broker. No obstante, las excepciones o reinicios del sistema de almacenamiento pueden provocar breves retrasos en la entrega. |
|
Cancelación |
No compatible. Una vez enviado el mensaje, la marca de tiempo de entrega no puede modificarse ni revocarse. |
Envío y consumo de mensajes programados
A continuación, los ejemplos usan el SDK de Java de Apache RocketMQ 5.x. Cada ejemplo de productor establece una marca de tiempo de entrega con setDeliveryTimestamp(); esta es la única diferencia respecto al envío de un mensaje normal. Para consultar la referencia completa del SDK, véase Apache RocketMQ 5.x SDKs.
Asegúrese de que su topic se haya creado con MessageType configurado como Delay antes de ejecutar estos ejemplos.
Mejores prácticas
Escalone los tiempos de entrega. Evite programar un lote grande de mensajes para la misma marca de tiempo exacta. Cuando muchos mensajes comparten una hora de entrega, el broker debe procesarlos todos simultáneamente, lo que aumenta la carga y puede retrasar la entrega. Distribuya las marcas de tiempo en un rango siempre que sea posible.
Implemente lógica de cancelación en los consumidores. Dado que no es posible revocar ni reprogramar un mensaje después de enviarlo, gestione la cancelación en el lado del consumidor. Por ejemplo, cuando un consumidor reciba un mensaje de "cancelar pedido no pagado", compruebe primero el estado actual del pedido; si el usuario ya pagó, omita la cancelación.
Preguntas frecuentes
¿Puedo cancelar o reprogramar un mensaje después de enviarlo?
No. La marca de tiempo de entrega es definitiva una vez que se envía el mensaje. Para manejar escenarios en los que una acción programada deja de ser necesaria, implemente esa lógica en su consumidor; por ejemplo, compruebe el estado actual del pedido antes de cancelar un pedido no pagado.
¿Qué sucede si establezco una hora de entrega en el pasado?
El broker lo entrega de inmediato, igual que un mensaje normal.
¿Por qué no encuentro mi mensaje programado en la consola?
Los mensajes programados permanecen invisibles hasta que se alcanza la marca de tiempo de entrega. Vuelva a comprobarlo después de esa hora; el mensaje aparecerá y estará disponible para los consumidores.