Node-RED

Nodo delay de Node-RED: cómo limitar la frecuencia de mensajes MQTT

Los sensores de alta frecuencia pueden saturar un broker, una base de datos o el móvil de un operador. Aprende cómo el nodo delay de Node-RED retrasa y limita los mensajes, cuándo poner en cola o descartar, cómo funciona el modo por topic y cómo respetar los límites del broker.

Nodo delay de Node-RED limitando un flujo rápido de mensajes MQTT antes de publicarlos en un broker
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

El nodo delay de Node-RED retiene los mensajes durante un tiempo fijo o los libera a un ritmo constante, lo que lo convierte en la forma más sencilla de domar flujos MQTT rápidos. En este tutorial lo usarás para limitar datos de sensores de alta frecuencia antes de publicarlos, limitar cada topic por separado, elegir entre poner en cola y descartar, controlar la cola en tiempo de ejecución y mantenerte holgadamente dentro de los límites del broker.

Por qué importa limitar la frecuencia en los flujos MQTT

Un sensor que muestrea cada 100 milisegundos produce diez mensajes por segundo. Multiplícalo por unas cuantas decenas de sensores y Node-RED estará enviando cientos de mensajes por segundo a lo que haya aguas abajo. A menudo nada de lo que hay después necesita ese ritmo:

  • Los brokers imponen límites. Los brokers compartidos y públicos limitan la frecuencia de mensajes por cliente. El servidor MQTT público gratuito en broker.connectmq.com, por ejemplo, permite 10 mensajes por segundo por cliente. Si lo superas, los mensajes se rechazan o el cliente se ve limitado.
  • Los paneles no dan abasto. Un gráfico en el navegador que se redibuja 50 veces por segundo es ilegible y desperdicia CPU.
  • Las bases de datos y las API cobran por escritura. Escribir cada muestra en bruto en una base de datos en la nube o llamar a una API HTTP por cada mensaje sale caro y puede hacer saltar los límites de la API.
  • Las notificaciones molestan. Una temperatura que oscila alrededor de un umbral puede generar decenas de alertas por minuto.

El nodo delay de Node-RED resuelve todo esto sin código.

Los modos del nodo delay de un vistazo

Abre un nodo delay y el desplegable Action ofrece dos familias de comportamiento:

Modo Opción Qué hace Uso típico
Delay each message Fixed delay Retiene cada mensaje el mismo tiempo Antirrebote, secuenciar acciones
Delay each message Random delay Retiene cada mensaje un tiempo aleatorio dentro de un rango Repartir la carga, simular dispositivos
Delay each message Override delay with msg.delay Usa el retardo en milisegundos indicado en el mensaje Temporización por mensaje
Rate limit All messages Libera como máximo N mensajes por intervalo Proteger un broker o una API
Rate limit For each msg.topic Limita cada topic de forma independiente, conservando el último valor Limitación de varios sensores

El modo delay nunca descarta nada; solo desplaza los mensajes en el tiempo. El modo rate limit pone en cola o descarta los mensajes sobrantes, según la opción que elijas.

Cola o descarte: la decisión que importa

En modo rate limit con All messages, lo predeterminado es poner en cola: los mensajes que superan el ritmo esperan en memoria y se liberan uno a uno. Marca drop intermediate messages y los mensajes sobrantes se descartarán. Las versiones recientes de Node-RED también permiten enviar los mensajes intermedios a una segunda salida, para que puedas enrutar el excedente a otro sitio, por ejemplo a un contador.

Elige preguntándote si importa cada mensaje:

  1. Importa cada mensaje (comandos, eventos, recuentos): pon en cola. Asegúrate de que el ritmo medio de entrada está por debajo del de liberación, o la cola crecerá indefinidamente.
  2. Solo importa el último valor (temperaturas, niveles, posiciones): descarta o usa el modo por topic. Conservas datos frescos y la memoria se mantiene estable.
  3. Necesitas ambas cosas: envía el excedente a la segunda salida y agrégalo, por ejemplo en una media.

Una cola que crece sin límite es el fallo clásico del nodo delay. Si los productores superan el ritmo de liberación durante horas, el uso de memoria sube hasta que Node-RED se ralentiza o se cae. Puedes limitar las colas globalmente con el ajuste nodeMessageBufferMaxLength de settings.js, pero la mejor solución es elegir el descarte para la telemetría.

Ejemplo: limita un sensor rápido antes de publicar

Simula un sensor ruidoso y limítalo a un mensaje cada dos segundos antes de volver a publicarlo en un topic de resumen. Sustituye 3e5b por tu propia cadena aleatoria para que los topics sean únicos en el broker público.

[
  {"id":"tabdl","type":"tab","label":"Delay demo"},
  {"id":"brkdl","type":"mqtt-broker","name":"ConnectMQ public","broker":"broker.connectmq.com","port":"1883","clientid":"nr-delay-3e5b","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true},
  {"id":"tick","type":"inject","z":"tabdl","name":"every 200 ms","props":[{"p":"payload","v":"","vt":"date"}],"repeat":"0.2","once":true,"onceDelay":"1","x":130,"y":80,"wires":[["sim"]]},
  {"id":"sim","type":"function","z":"tabdl","name":"simulate vibration","func":"msg.topic = 'connectmq/demo/3e5b/press1/vibration';\nmsg.payload = { mm_s: Number((2 + Math.random() * 3).toFixed(2)), ts: msg.payload };\nreturn msg;","outputs":1,"x":330,"y":80,"wires":[["rate"]]},
  {"id":"rate","type":"delay","z":"tabdl","name":"1 msg / 2 s, drop","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":540,"y":80,"wires":[["pub","dbgdl"]]},
  {"id":"pub","type":"mqtt out","z":"tabdl","name":"publish","topic":"","qos":"0","retain":"false","broker":"brkdl","x":730,"y":60,"wires":[]},
  {"id":"dbgdl","type":"debug","z":"tabdl","name":"released","active":true,"complete":"payload","x":740,"y":110,"wires":[]}
]

Entran cinco mensajes por segundo y sale uno cada dos segundos, siempre con una lectura fresca. Observa el resultado desde una terminal:

mosquitto_sub -h broker.connectmq.com -p 1883 -i demo-sub-3e5b \
  -t "connectmq/demo/3e5b/#" -v

Sin el nodo delay, este flujo publicaría cinco mensajes por segundo desde un solo cliente, ya la mitad del límite por cliente del broker público. Añade un segundo sensor y llegarías al límite.

Limitación por topic para muchos sensores

Cuando un único nodo mqtt in se suscribe con un comodín como connectmq/demo/3e5b/+/telemetry, una limitación simple trata todos los topics como un único flujo. Un sensor muy hablador acabaría desplazando a uno silencioso. Cambia el nodo delay a Rate limit → For each msg.topic.

En este modo el nodo conserva solo el mensaje más reciente de cada topic y los libera al ritmo configurado, recorriendo los topics por turnos. Cada sensor tiene su turno y solo se envía su último valor. Es exactamente lo que quiere un panel o un proceso que escribe en una base de datos. Asegúrate de que msg.topic está bien definido; si todos los mensajes tienen el mismo topic, el modo por topic se comporta como una cola de un solo elemento.

Controla la cola en tiempo de ejecución

Un nodo delay en modo cola atiende a propiedades especiales de los mensajes entrantes:

Propiedad Efecto
msg.reset Vacía la cola sin enviar nada
msg.flush Envía de inmediato los mensajes en cola; un número envía esa cantidad
msg.rate En modo rate limit con la opción "allow msg.rate to override", cambia el ritmo en milisegundos entre mensajes
msg.delay En modo override, fija el retardo de este mensaje en milisegundos

msg.reset es útil cuando una máquina se detiene: las lecturas en cola de antes de la parada ya no tienen sentido. msg.flush ayuda cuando una conexión se restablece y quieres liberar de golpe los comandos almacenados. Conecta un nodo inject con la propiedad igual a true para probarlos.

Antirrebote de alertas con un delay

Los límites de frecuencia también acaban con las tormentas de alertas. Coloca un nodo delay limitado a un mensaje cada 10 minutos con drop intermediate messages antes de un nodo de notificación por correo o chat. La primera alerta sale de inmediato; las repeticiones dentro de la ventana se descartan. Para alertas por dispositivo, asigna a msg.topic el ID del dispositivo y usa el modo por topic, de modo que un dispositivo no pueda silenciar la alarma de otro. Si prefieres mantener esta lógica en código, el ejemplo de enfriamiento de nuestra guía de subflujos de Node-RED hace lo mismo por topic.

Lista de errores comunes

  1. Poner telemetría en cola. Usa el descarte o el modo por topic cuando solo importa el último valor.
  2. Limitar después del paso costoso. Coloca el nodo delay antes de las escrituras en bases de datos, las llamadas HTTP o los nodos function pesados, no después.
  3. Falta msg.topic. El modo por topic necesita un topic significativo en cada mensaje.
  4. Confundir delay con rate limit. El modo delay desplaza cada mensaje; no reduce el número de mensajes.
  5. Limitar en la capa equivocada. Si los dispositivos publican mucho más rápido de lo que nadie necesita, corrige la frecuencia de muestreo del firmware en lugar de descartar datos en Node-RED.
  6. Ignorar los límites del broker. Conoce los límites de frecuencia y tamaño de mensajes de tu broker y diseña por debajo de ellos.

Para transformaciones antes o después de limitar, consulta la guía del nodo function de Node-RED, y para lo básico sobre cómo cablear MQTT en Node-RED, el tutorial de Node-RED MQTT. Las opciones del nodo delay también están documentadas en la ayuda integrada y en la documentación de los nodos principales de Node-RED.

Publica datos limitados en ConnectMQ

Cuando tu flujo publique a un ritmo razonable, pásalo a un broker privado. ConnectMQ es un broker MQTT gestionado con TLS en el puerto 8883, caducidad de mensajes de MQTT 5 y cuotas por plan que protegen a todos los tenants frente a inundaciones. El plan Serverless gratuito admite hasta 25 conexiones y mensajes de 256 KB, y los planes Serverless de pago añaden QoS 2 y suscripciones compartidas cuando escalas. Crea tu broker en app.connectmq.com sin tarjeta de crédito y cambia el nodo broker a TLS con tus credenciales generadas. Para comparar modelos de despliegue, lee nuestra guía sobre el broker MQTT en la nube.

Preguntas frecuentes

¿Cuál es la diferencia entre delay y rate limit en el nodo delay de Node-RED?

El modo delay retiene cada mensaje durante un tiempo, pero deja pasar todos los mensajes. El modo rate limit controla cuántos mensajes salen por intervalo y puede poner en cola o descartar los sobrantes.

¿Cómo limito cada topic MQTT por separado en Node-RED?

Configura la acción del nodo delay como Rate limit y elige "For each msg.topic". El nodo conserva el último mensaje de cada topic y libera los topics por turnos al ritmo configurado.

¿Cómo vacío la cola de un nodo delay?

Envía un mensaje con msg.reset igual a cualquier valor. La cola se vacía sin enviar los mensajes que contenía.

¿Puede el nodo delay causar problemas de memoria?

Sí, si pone mensajes en cola más rápido de lo que los libera durante periodos largos. Usa el descarte o el modo por topic para la telemetría, o limita el tamaño de la cola con nodeMessageBufferMaxLength en settings.js.

Artículos relacionados

Cliente OPC UA en Node-RED hacia MQTT con topics ISA-95

Usa node-red-contrib-opcua para suscribirte a variables OPC UA de un PLC o de un servidor de simulación, asignar los node IDs a topics MQTT de estilo ISA-95 y publicar los valores con calidad y marcas de tiempo.

10 min de lectura

Node-RED Dashboard 2.0 con MQTT: indicadores, gráficos y controles

Un tutorial práctico de Node-RED Dashboard 2.0: suscríbete a telemetría MQTT en directo, muéstrala en indicadores y en un gráfico de líneas, y controla un dispositivo con un interruptor que publica comandos y refleja el estado real.

9 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.