Glosario de Automatización • Expiración de sesión de MQTT

¿Qué es session expiry y clean start en MQTT?

Ingeniería Merobix • • 8 min de lectura

Cuando un gateway de telemetría se desprende de un broker MQTT, el broker enfrenta una pregunta: ¿debería recordar a este cliente y retener los mensajes destinados a él y, de ser así, por cuánto tiempo? MQTT versión 5 responde esto con precisión mediante dos controles: la bandera clean start, que decide si reanudar o reiniciar una sesión, y el intervalo de expiración de sesión, que pone un reloj a cuánto sobrevive una sesión desconectada. Esta guía explica qué hacen estos dos ajustes, cómo gobiernan los mensajes en cola que esperan a un gateway intermitente, y por qué reemplazaron el modelo más burdo de todo o nada del MQTT anterior.

Volver al glosario

Expiración de sesión de MQTT en una línea: En MQTT 5, clean start es una bandera que el cliente fija al conectar y que decide si el broker reanuda una sesión existente o la descarta y empieza de cero, y el intervalo de expiración de sesión es un temporizador que fija cuánto conserva el broker una sesión desconectada y sus mensajes en cola antes de borrarlos. Juntos controlan si un gateway que reconecta retoma donde se quedó, incluidos los mensajes en cola mientras estuvo fuera de línea, o regresa con la pizarra limpia.

El estado de sesión y lo que el broker recuerda

Una sesión MQTT es el estado que el broker sostiene a nombre de un cliente: sus suscripciones y cualquier mensaje que deba entregársele y aún no haya sido reconocido. Mientras un cliente está conectado, ese estado obviamente está en uso. El comportamiento interesante es lo que pasa cuando el cliente se desconecta, de forma esperada o no. Si el broker conserva la sesión, entonces cuando el cliente vuelve no tiene que resuscribirse, y los mensajes que llegaron a sus suscripciones mientras estuvo fuera pueden entregársele, así que no se pierde de nada. Si el broker tira la sesión, el cliente regresa a nada y debe empezar de nuevo.

Persistir una sesión es lo que permite a un cliente sobrevivir una desconexión sin perder datos. Para un suscriptor que debe recibir cada lectura, una sesión sostenida significa que el broker pone en cola los mensajes que llegan durante la interrupción y los entrega al reconectar, de modo que el hueco de conectividad no se convierta en un hueco de datos. Esto aplica solo a mensajes enviados con una calidad de servicio que garantiza la entrega; el mecanismo existe precisamente para honrar esa garantía a través de una desconexión en lugar de tirar los mensajes en cuanto el cliente desaparece.

El costo de recordar son los recursos. Cada sesión retenida consume memoria del broker y, si los mensajes se acumulan, almacenamiento, y un broker que sirve a una flota grande no puede conservar por siempre cada sesión de cada cliente que alguna vez conectó, en especial de clientes que quizá nunca regresen. Esa tensión - recordar lo suficiente para sobrevivir una reconexión real, pero no atesorar estado de clientes que se fueron para siempre - es exactamente lo que los dos controles de MQTT 5 existen para resolver.

Clean start y el intervalo de expiración de sesión

Clean start es un booleano que el cliente fija al conectar. En verdadero, le dice al broker que descarte cualquier sesión existente de este cliente y comience una completamente nueva, así que el cliente arranca limpio sin suscripciones sobrantes ni mensajes en cola. En falso, le dice al broker que reanude una sesión existente si todavía hay una presente, así que el cliente recupera sus suscripciones y recibe lo que quedó en cola mientras estuvo fuera. Clean start gobierna por lo tanto el comportamiento en el momento de conectar: pizarra limpia, o continuar donde me quedé.

El intervalo de expiración de sesión gobierna lo que pasa después de que el cliente se desconecta. Es una duración que el cliente puede especificar diciendo cuánto tiempo debe el broker mantener viva la sesión una vez que termina la conexión. Si el cliente reconecta dentro de ese intervalo, la sesión sigue ahí para reanudarse; si el intervalo vence primero, el broker borra la sesión y sus mensajes en cola, y una reconexión posterior empieza de cero sin importar la bandera clean start. Un valor de cero significa que la sesión termina de inmediato al desconectar, mientras que un valor grande pide al broker sostener la sesión por un periodo extendido.

Los dos trabajan juntos. Un cliente que quiere sobrevivir una interrupción breve conecta con clean start en falso y un intervalo de expiración de sesión lo bastante largo para cubrir la desconexión esperada, de modo que una caída y reconexión rápida reanuda limpio con todos los mensajes en cola entregados. Un cliente que no quiere historia conecta con clean start en verdadero. El avance importante sobre el MQTT anterior es que el intervalo de expiración es un valor con tiempo elegido por el cliente, en lugar de la vieja elección binaria entre una sesión que se esfumaba al instante o una que persistía indefinidamente.

Expiración de sesión para gateways intermitentes en SCADA en la nube

Los gateways de campo en enlaces celulares y de radio son intermitentes: se caen y reconectan conforme la señal se desvanece, el proceso cicla o el operador de red tiene un hipo, y cómo el broker maneja esos rebotes decide si el flujo de telemetría los sobrevive intacto. Con un intervalo de expiración de sesión sensato y clean start en falso, un gateway que se cae un minuto reconecta a una sesión que el broker sostenía, recibe los comandos o mensajes que quedaron en cola durante el hueco, y sigue adelante sin pérdida. El rebote se vuelve un no-evento en lugar de un agujero en los datos.

Elegir el intervalo es un balance afinado al enlace. Fíjelo demasiado corto y un gateway que se queda caído un poco más de lo esperado pierde su sesión y los mensajes en cola, convirtiendo una interrupción recuperable en un hueco de datos. Fíjelo demasiado largo y el broker sostiene sesiones y mensajes en cola de gateways que quizá lleven horas idos, consumiendo recursos y apilando mensajes viejos que tal vez ya no valga la pena entregar. El valor correcto refleja cuánto dura una interrupción realista y cuánta utilidad conserva la cola una vez que el gateway regresa: lo bastante largo para librar los rebotes normales, no tanto que atesore estado de los genuinamente muertos.

Para una plataforma SCADA en la nube como Merobix, este modelo con tiempo es lo que permite a la capa de mensajería portarse con sensatez sobre los enlaces poco confiables en los que viven los sitios de campo. Un gateway que rebota debe reanudar su sesión y ponerse al día con lo que se perdió, mientras que un gateway que lleva un tramo largo fuera de línea no debe dejar al broker sosteniendo indefinidamente una pila creciente de mensajes sin entregar. Los controles de MQTT 5 dan exactamente ese matiz - reanudar lo recuperable, expirar lo abandonado - para que la plataforma se mantenga resiliente a interrupciones cortas sin pagar un costo sin límite por las largas, algo que el viejo modelo de sesión de todo o nada no podía expresar.

Preguntas frecuentes

¿Cuál es la diferencia entre clean start y session expiry?

Clean start es una bandera fijada al conectar que decide si el broker reanuda una sesión existente o la descarta y empieza de cero en ese momento. El intervalo de expiración de sesión es un temporizador para después de la desconexión que decide cuánto conserva el broker la sesión antes de borrarla. Clean start controla el comportamiento al conectar; session expiry controla cuánto sobrevive una sesión mientras el cliente está fuera.

¿En qué difiere el session expiry de MQTT 5 de la vieja bandera clean session?

El MQTT anterior ofrecía solo una bandera binaria clean session: o la sesión se esfumaba en el instante en que el cliente se desconectaba, o persistía indefinidamente sin manera de ponerle límite. MQTT 5 lo divide en clean start, que controla reanudar contra empezar de cero al conectar, y un intervalo de expiración de sesión, que es una duración con tiempo elegida por el cliente para cuánto se conserva una sesión desconectada. El avance clave es la expiración con tiempo, que deja a una sesión sobrevivir interrupciones breves sin persistir para siempre.

¿Qué intervalo de expiración de sesión debe usar un gateway intermitente?

Lo bastante largo para cubrir una interrupción realista de su enlace, de modo que una caída y reconexión normal reanude la sesión y entregue los mensajes en cola, pero no tanto que el broker atesore estado y mensajes viejos de un gateway que quizá lleve horas ido. El valor correcto depende de cuánto duran las desconexiones típicas y cuánto tiempo siguen siendo útiles los datos en cola. Demasiado corto arriesga huecos de datos en interrupciones largas; demasiado largo desperdicia recursos del broker en sesiones abandonadas.

Más en Protocolos industriales
Sesión limpia vs persistente  •  Intervalo de expiración de mensajes MQTT  •  Corregir bucles de timeout de sesion OPC UA  •  Clave de actualización vs clave de sesión  •  Corregir un bucle de reconexion de cliente MQTT  •  Todo en Protocolos industriales →
Capacitación SCADA gratuita para operadores
Merobix University - 70 lecciones en video y 261 preguntas de examen, del primer inicio de sesión a los reportes de cumplimiento (contenido en inglés). Sin llamada de ventas.
Comenzar gratis →