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:
- 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.
- Solo importa el último valor (temperaturas, niveles, posiciones): descarta o usa el modo por topic. Conservas datos frescos y la memoria se mantiene estable.
- 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
- Poner telemetría en cola. Usa el descarte o el modo por topic cuando solo importa el último valor.
- 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.
- Falta
msg.topic. El modo por topic necesita un topic significativo en cada mensaje. - Confundir delay con rate limit. El modo delay desplaza cada mensaje; no reduce el número de mensajes.
- 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.
- 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.



