O delay node do Node-RED segura as mensagens por um tempo definido ou as libera a uma taxa fixa, o que o torna a forma mais simples de domar fluxos MQTT rápidos. Neste tutorial você vai usá-lo para limitar dados de sensores de alta frequência antes de publicar, limitar a taxa de cada topic separadamente, escolher entre enfileirar e descartar, controlar a fila em tempo de execução e ficar com folga dentro dos limites do broker.
Por que limitar a taxa importa em flows MQTT
Um sensor que amostra a cada 100 milissegundos produz dez mensagens por segundo. Multiplique isso por algumas dezenas de sensores e o Node-RED estará empurrando centenas de mensagens por segundo para o que estiver a jusante. Muitas vezes, nada a jusante precisa dessa taxa:
- Brokers impõem limites. Brokers compartilhados e públicos limitam a taxa de mensagens por cliente. O servidor MQTT público gratuito em
broker.connectmq.com, por exemplo, permite 10 mensagens por segundo por cliente. Ultrapasse isso e as mensagens são rejeitadas ou o cliente é limitado. - Dashboards não acompanham. Um gráfico no navegador redesenhando 50 vezes por segundo é ilegível e desperdiça CPU.
- Bancos de dados e APIs cobram por gravação. Gravar cada amostra bruta em um banco na nuvem ou chamar uma API HTTP por mensagem fica caro e pode estourar os limites de taxa da API.
- Notificações irritam as pessoas. Uma temperatura oscilando em torno de um limite pode gerar dezenas de alertas por minuto.
O delay node do Node-RED resolve tudo isso sem código.
Modos do delay node em resumo
Abra um delay node e o menu Action oferece duas famílias de comportamento:
| Modo | Opção | O que faz | Uso típico |
|---|---|---|---|
| Delay each message | Fixed delay | Segura cada mensagem pelo mesmo tempo | Debounce, sequenciamento de ações |
| Delay each message | Random delay | Segura cada mensagem por um tempo aleatório dentro de uma faixa | Distribuir carga, simular dispositivos |
| Delay each message | Override delay with msg.delay |
Usa o atraso em milissegundos vindo da mensagem | Temporização por mensagem |
| Rate limit | All messages | Libera no máximo N mensagens por intervalo | Proteger um broker ou uma API |
| Rate limit | For each msg.topic |
Limita cada topic de forma independente, mantendo o valor mais recente | Limitar vários sensores |
O modo de atraso nunca descarta nada; ele apenas desloca as mensagens no tempo. O modo rate limit enfileira as mensagens excedentes ou as descarta, dependendo da opção escolhida.
Enfileirar ou descartar: a decisão que importa
No modo rate limit com All messages, o padrão é enfileirar: as mensagens além da taxa esperam na memória e são liberadas uma a uma. Marque drop intermediate messages e as mensagens excedentes são descartadas. Versões recentes do Node-RED também oferecem enviar as mensagens intermediárias para uma segunda saída, para que você direcione o excesso para outro lugar, por exemplo um contador.
Escolha perguntando se cada mensagem importa:
- Toda mensagem importa (comandos, eventos, contagens): enfileire. Garanta que a taxa média de entrada fique abaixo da taxa de liberação, ou a fila cresce para sempre.
- Só o valor mais recente importa (temperaturas, níveis, posições): descarte ou use o modo por topic. Você mantém dados atuais e a memória fica estável.
- Você precisa dos dois: envie o excesso para a segunda saída e agregue-o, por exemplo em uma média.
Uma fila que cresce sem limite é a falha clássica do delay node. Se os produtores superam a taxa de liberação por horas, o uso de memória sobe até o Node-RED ficar lento ou travar. Você pode limitar as filas globalmente com a configuração nodeMessageBufferMaxLength no settings.js, mas a correção melhor é escolher o descarte para telemetria.
Exemplo: limitar um sensor rápido antes de publicar
Simule um sensor ruidoso e limite-o a uma mensagem a cada dois segundos antes de republicar em um topic de resumo. Substitua 3e5b por uma string aleatória sua para manter os topics únicos no servidor 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":[]}
]
Entram cinco mensagens por segundo; sai uma mensagem a cada dois segundos, sempre com uma leitura atual. Acompanhe o resultado em um terminal:
mosquitto_sub -h broker.connectmq.com -p 1883 -i demo-sub-3e5b \
-t "connectmq/demo/3e5b/#" -v
Sem o delay node, este flow publicaria cinco mensagens por segundo a partir de um único cliente, já metade do limite por cliente do servidor público. Adicione um segundo sensor e você chegaria ao limite.
Rate limit por topic para muitos sensores
Quando um único node mqtt in assina com um wildcard como connectmq/demo/3e5b/+/telemetry, um rate limit simples trata todos os topics como um só fluxo. Um sensor muito falante acabaria abafando um sensor silencioso. Mude o delay node para Rate limit → For each msg.topic.
Nesse modo, o node mantém apenas a mensagem mais recente de cada topic e as libera na taxa configurada, alternando entre os topics. Cada sensor tem sua vez, e apenas o valor mais recente dele é enviado. É exatamente o que um dashboard ou um gravador de banco de dados quer. Garanta que msg.topic esteja definido corretamente; se todas as mensagens tiverem o mesmo topic, o modo por topic se comporta como uma fila única de uma posição.
Controle a fila em tempo de execução
Um delay node em modo de fila escuta propriedades especiais nas mensagens de entrada:
| Propriedade | Efeito |
|---|---|
msg.reset |
Limpa a fila sem enviar nada |
msg.flush |
Envia imediatamente as mensagens enfileiradas; um número envia essa quantidade |
msg.rate |
No modo rate limit com a opção "allow msg.rate to override", altera a taxa em milissegundos entre mensagens |
msg.delay |
No modo override, define o atraso desta mensagem em milissegundos |
msg.reset é útil quando uma máquina para: as leituras enfileiradas de antes da parada já não fazem sentido. msg.flush ajuda quando uma conexão volta e você quer liberar de uma vez os comandos acumulados. Ligue um inject node com a propriedade definida como true para testá-las.
Debounce de alertas com um delay
O rate limit também cura tempestades de alertas. Coloque um delay node em rate limit, configurado para uma mensagem a cada 10 minutos com drop intermediate messages, antes de um node de notificação por e-mail ou chat. O primeiro alerta sai na hora; as repetições dentro da janela são descartadas. Para alertas por dispositivo, defina msg.topic como o ID do dispositivo e use o modo por topic, para que um dispositivo não suprima o alarme de outro. Se você preferir manter essa lógica em código, o exemplo de cooldown do nosso guia de subflows no Node-RED faz a mesma coisa por topic.
Checklist de erros comuns
- Enfileirar telemetria. Use descarte ou o modo por topic quando só o valor mais recente importa.
- Limitar a taxa depois da etapa cara. Coloque o delay node antes de gravações em banco, chamadas HTTP ou function nodes pesados, não depois.
- Falta de
msg.topic. O modo por topic precisa de um topic significativo em cada mensagem. - Confundir delay com rate limit. O modo de atraso desloca cada mensagem; ele não reduz a quantidade de mensagens.
- Limitar na camada errada. Se os dispositivos publicam muito mais rápido do que alguém precisa, corrija a taxa de amostragem no firmware em vez de descartar dados no Node-RED.
- Ignorar os limites do broker. Conheça os limites de taxa e de tamanho de mensagem do seu broker e projete abaixo deles.
Para transformações antes ou depois da limitação, veja o guia do function node do Node-RED e, para o básico de como ligar MQTT no Node-RED, o tutorial Node-RED MQTT. As opções do delay node também estão documentadas na ajuda embutida e na documentação dos core nodes do Node-RED.
Publique dados limitados no ConnectMQ
Quando seu flow publicar a uma taxa sensata, leve-o para um broker privado. O ConnectMQ é um broker MQTT gerenciado com TLS na porta 8883, message expiry do MQTT 5 e cotas por plano que protegem todos os clientes contra floods. O plano Serverless gratuito suporta até 25 conexões e mensagens de 256 KB, e os planos Serverless pagos adicionam QoS 2 e shared subscriptions quando você escala. Crie seu broker em app.connectmq.com sem cartão de crédito e depois mude o node do broker para TLS com as credenciais geradas. Para comparar modelos de implantação, leia nosso guia sobre broker MQTT na nuvem.
Perguntas frequentes
Qual é a diferença entre delay e rate limit no delay node do Node-RED?
O modo delay segura cada mensagem por um tempo, mas deixa passar todas. O modo rate limit controla quantas mensagens saem por intervalo e pode enfileirar ou descartar as excedentes.
Como limito a taxa de cada topic MQTT separadamente no Node-RED?
Defina a ação do delay node como Rate limit e escolha "For each msg.topic". O node mantém a mensagem mais recente de cada topic e libera os topics em sequência, na taxa configurada.
Como limpo a fila de um delay node?
Envie uma mensagem com msg.reset definido com qualquer valor. A fila é esvaziada sem enviar as mensagens enfileiradas.
O delay node pode causar problemas de memória?
Sim, se ele enfileirar mensagens mais rápido do que as libera por longos períodos. Use descarte ou o modo por topic para telemetria, ou limite o tamanho da fila com nodeMessageBufferMaxLength no settings.js.



