¿Qué es un mensaje retenido de MQTT?
MQTT es por defecto un sistema de publicar y olvidar: si se suscribe a un tópico después de que se envió el último mensaje, espera, posiblemente mucho tiempo, al siguiente. La función de mensaje retenido corrige esto indicando al broker que conserve el valor más reciente de un tópico y se lo entregue a cualquiera que se suscriba después. Esta guía explica cómo funciona la bandera de retención, cómo permite a un cliente recién conectado o que se reconecta obtener el valor actual de inmediato, y en qué difiere un mensaje retenido de un testamento.
Mensaje retenido de MQTT en una línea: Un mensaje retenido es un mensaje MQTT publicado con la bandera de retención activada, que indica al broker guardarlo como el último valor conocido de ese tópico. El broker conserva solo el mensaje retenido más reciente por tópico y lo entrega de inmediato a cualquier cliente que se suscriba después, de modo que un suscriptor nuevo o que se reconecta obtiene el valor actual sin esperar a la siguiente publicación. Publicar un nuevo mensaje retenido reemplaza al guardado, y publicar un mensaje retenido vacío lo borra.
Cómo funciona la bandera de retención
Cuando un publicador envía un mensaje con la bandera de retención activada, el broker hace dos cosas: lo entrega a los suscriptores actuales como de costumbre, y también lo guarda como el mensaje retenido del tópico. De ahí en adelante, el broker conserva exactamente un mensaje retenido por tópico - el más reciente - y cualquier cliente que se suscriba a un tópico coincidente recibe ese mensaje guardado de inmediato, marcado para que el cliente pueda saber que fue retenido y no recién publicado. El valor guardado persiste en el broker hasta que algo lo reemplace o lo borre.
Solo se conserva el último mensaje retenido; la retención es un caché de último valor, no un historial ni una cola. Cada nueva publicación retenida en un tópico sobrescribe al mensaje retenido anterior, así que el broker siempre conserva el valor actual y nada más viejo. Para eliminar por completo el mensaje retenido de un tópico, un publicador envía un mensaje retenido con carga útil vacía, que el broker interpreta como una señal para borrar el valor guardado, de modo que los suscriptores futuros no reciban nada hasta que se publique un valor real de nuevo.
Vale la pena notar que la retención es una decisión por mensaje. Un publicador puede enviar algunos mensajes retenidos y otros no en el mismo tópico, aunque para tópicos de estilo estado es común retener siempre para que el broker conserve de forma consistente el estado actual. La retención también interactúa de forma natural con las suscripciones: un suscriptor que se desconecta brevemente y se resuscribe recibirá el valor retenido al reconectarse, lo que hace tan útil a la función para clientes que van y vienen.
Valor actual al instante al conectarse
El beneficio práctico es contexto inmediato al conectarse. Considere un tópico que lleva el nivel de un tanque que cambia solo cuando el nivel se mueve - quizá cada varios minutos. Sin retención, un cliente que se conecta justo después de una actualización debe esperar al siguiente cambio antes de siquiera enterarse del nivel, y hasta entonces su vista de ese tanque está en blanco. Con retención, el broker entrega al cliente el último nivel publicado en el instante en que se suscribe, así que la pantalla del cliente se llena de inmediato con el valor actual verdadero en lugar de un campo vacío.
Esto importa más para valores que se actualizan con poca frecuencia o de forma irregular. Un estado de marcha de una bomba podría permanecer sin cambio durante horas; una posición de válvula podría cambiar solo cuando un operador actúa. Para todos esos datos de tipo estado, la retención es lo que convierte una suscripción en una instantánea inmediata de la realidad actual en lugar de una espera al siguiente evento. La telemetría de cambio rápido se beneficia menos, porque un valor nuevo llegará en un momento de todas formas, pero incluso ahí la retención garantiza un punto de partida en lugar de un hueco.
Para un SCADA en la nube como Merobix, este comportamiento es lo que hace elegante una reconexión. Cuando la conexión de la plataforma a un broker cae y se restablece - un evento rutinario sobre enlaces celulares o satelitales - los mensajes retenidos le permiten repoblar de inmediato los niveles de tanque, presiones y estados de equipo actuales al resuscribirse, en lugar de mostrar mosaicos obsoletos o vacíos hasta que cada punto cambie y se publique de nuevo. Publicar los tópicos de estado como retenidos en el borde es por tanto una pequeña decisión de configuración con un efecto desproporcionado en qué tan rápido ve un operador una imagen precisa tras cualquier interrupción.
Mensaje retenido frente al testamento
Los mensajes retenidos y los mensajes de testamento se confunden con facilidad porque ambos implican que el broker conserva un mensaje en nombre de un cliente, pero responden preguntas distintas. Un mensaje retenido es sobre estado: es el último valor conocido de un tópico, conservado para que los suscriptores futuros puedan aprender la condición actual de inmediato. Se publica de forma deliberada cada vez que el valor cambia y refleja una operación normal y sana - la respuesta a cuál es el valor de este tópico ahora mismo.
Un testamento (Last Will and Testament) es sobre falla: es un mensaje que un cliente registra al conectarse, que el broker publica solo si ese cliente se desconecta de forma abrupta, como cuando cae de la red sin un apagado limpio. El trabajo del testamento es anunciar que un cliente se fue, para que otros sistemas se enteren de la falla. Donde un mensaje retenido dice aquí está el valor actual, un testamento dice este cliente acaba de morir - uno describe estado, el otro describe un evento, específicamente una desconexión inesperada.
Se usan con frecuencia juntos, y un testamento puede a su vez marcarse como retenido. Un patrón común para un dispositivo remoto es publicar un estado retenido en un tópico - conectado mientras está sano - y registrar un testamento retenido en el mismo tópico que lo cambia a desconectado si el dispositivo se cae. Entonces el broker siempre conserva un estado actual y correcto para ese dispositivo: conectado mientras publica normalmente, y desconectado en el momento en que su desconexión abrupta dispara el testamento. La retención provee la persistencia del estado actual; el testamento provee la señal automática de falla que mantiene honesto ese estado cuando un dispositivo desaparece.
Preguntas frecuentes
¿Cuántos mensajes retenidos conserva el broker por tópico?
Exactamente uno - el más reciente. La retención es un caché de último valor, no un historial ni una cola, así que cada nueva publicación retenida sobrescribe a la anterior y el broker siempre conserva solo el valor actual de ese tópico. Para borrarlo, un publicador envía un mensaje retenido con carga útil vacía, lo que elimina el valor guardado.
¿Cuál es la diferencia entre un mensaje retenido y un testamento?
Un mensaje retenido es el último valor conocido de un tópico, conservado para que cualquier suscriptor nuevo aprenda de inmediato el estado actual durante la operación normal. Un testamento es un mensaje que el broker publica solo cuando un cliente se desconecta de forma abrupta, anunciando que el cliente falló. Uno describe el estado actual; el otro anuncia una desconexión inesperada, y a menudo se usan juntos.
¿Por qué se beneficia de los mensajes retenidos un cliente que se reconecta?
Sin retención, un cliente que se resuscribe debe esperar a la siguiente publicación antes de aprender un valor de cambio lento, dejando su vista en blanco mientras tanto. Con retención, el broker entrega el último valor guardado en el instante en que el cliente se resuscribe, así que repuebla de inmediato niveles de tanque, presiones y estados. Eso hace elegantes las reconexiones tras un enlace caído en lugar de dejar pantallas obsoletas o vacías.
Servicios de automatización
¿Necesita convertir esta información en un sistema que funcione?
Merobix integra SCADA, programa PLC Allen-Bradley y Siemens, y diseña y fabrica tableros de control industrial.
Las solicitudes de reunión se revisan antes de confirmarse.