Node-RED

Delay node do Node-RED: limitando a taxa de mensagens MQTT

Sensores de alta frequência podem inundar um broker, um banco de dados ou o celular de um operador. Veja como o delay node do Node-RED atrasa e limita mensagens, quando enfileirar ou descartar, como funciona o modo por topic e como ficar dentro dos limites do broker.

Delay node do Node-RED limitando um fluxo rápido de mensagens MQTT antes de publicar em um broker
Rode isso no seu próprio broker MQTTTenha um broker MQTT privado e gerenciado no plano Free e comece com exemplos de código prontos.
Teste grátis Exemplos de código Sem cartão de crédito

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:

  1. 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.
  2. 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.
  3. 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

  1. Enfileirar telemetria. Use descarte ou o modo por topic quando só o valor mais recente importa.
  2. 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.
  3. Falta de msg.topic. O modo por topic precisa de um topic significativo em cada mensagem.
  4. Confundir delay com rate limit. O modo de atraso desloca cada mensagem; ele não reduz a quantidade de mensagens.
  5. 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.
  6. 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.

Artigos relacionados

Node-RED Dashboard 2.0 com MQTT: gauges, gráficos e controles

Um tutorial prático do Node-RED Dashboard 2.0: assine telemetria MQTT ao vivo, exiba-a em gauges e em um gráfico de linha e controle um dispositivo com um switch que publica comandos e reflete o estado real.

9 min de leitura

Cliente OPC UA no Node-RED para MQTT com topics ISA-95

Use o node-red-contrib-opcua para assinar variáveis OPC UA em um CLP ou servidor de simulação, mapear node IDs para topics MQTT no estilo ISA-95 e publicar os valores com qualidade e timestamps.

10 min de leitura

Todos os artigos →

Seu broker MQTT privado está a poucos cliques de distância

Crie uma conta, receba as credenciais do seu broker e conecte seu primeiro dispositivo — sem servidores para instalar, atualizar ou escalar.