Node-RED

Node-RED Delay Node: MQTT Mesajlarında Hız Sınırlama

Yüksek frekanslı sensörler bir broker'ı, bir veritabanını ya da bir operatörün telefonunu mesaj yağmuruna tutabilir. Node-RED delay node'unun mesajları nasıl geciktirip hız sınırladığını, ne zaman kuyruğa alıp ne zaman atacağınızı, topic başına modun nasıl çalıştığını ve broker sınırları içinde nasıl kalacağınızı öğrenin.

Hızlı bir MQTT mesaj akışını bir broker'a yayınlamadan önce kısan Node-RED delay node'u
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Node-RED delay node'u mesajları belirli bir süre bekletir ya da sabit bir hızda serbest bırakır; bu da onu hızlı MQTT akışlarını dizginlemenin en basit yolu yapar. Bu eğitimde onu yüksek frekanslı sensör verisini yayınlamadan önce kısmak, her topic'i ayrı ayrı hız sınırlamak, kuyruğa alma ile atma arasında seçim yapmak, kuyruğu çalışma anında kontrol etmek ve broker sınırları içinde rahatça kalmak için kullanacaksınız.

MQTT Akışlarında Hız Sınırlama Neden Önemlidir?

Her 100 milisaniyede bir örnekleme yapan bir sensör saniyede on mesaj üretir. Bunu birkaç düzine sensörle çarpın; Node-RED aşağı akıştaki her neyse ona saniyede yüzlerce mesaj iter. Çoğu zaman aşağı akıştaki hiçbir şeyin bu hıza ihtiyacı yoktur:

  • Broker'lar sınır uygular. Paylaşımlı ve herkese açık broker'lar istemci başına mesaj hızını sınırlar. Örneğin broker.connectmq.com adresindeki ücretsiz herkese açık MQTT broker'ı istemci başına saniyede 10 mesaja izin verir. Bunu aşarsanız mesajlar reddedilir ya da istemci kısıtlanır.
  • Panolar yetişemez. Saniyede 50 kez yeniden çizilen bir tarayıcı grafiği okunamaz ve CPU'yu boşa harcar.
  • Veritabanları ve API'ler yazma başına ücret alır. Her ham örneği bir bulut veritabanına yazmak ya da her mesaj için bir HTTP API çağırmak pahalılaşır ve API hız sınırlarına takılabilir.
  • Bildirimler insanları rahatsız eder. Bir eşik etrafında gezinen bir sıcaklık dakikada düzinelerce uyarı üretebilir.

Node-RED delay node'u bunların hepsini kod yazmadan çözer.

Bir Bakışta Delay Node Modları

Bir delay node'u açtığınızda Action açılır menüsü iki davranış ailesi sunar:

Mod Seçenek Ne yapar Tipik kullanım
Delay each message Fixed delay Her mesajı aynı süre bekletir Debounce, eylemleri sıralama
Delay each message Random delay Her mesajı bir aralıktaki rastgele bir süre bekletir Yükü yaymak, cihaz simülasyonu
Delay each message Override delay with msg.delay Mesajdaki milisaniye cinsinden gecikmeyi kullanır Mesaj başına zamanlama
Rate limit All messages Aralık başına en fazla N mesaj serbest bırakır Bir broker'ı veya API'yi korumak
Rate limit For each msg.topic Her topic'i bağımsız sınırlar, en son değeri tutar Çoklu sensör kısma

Delay modu asla bir şey atmaz; yalnızca mesajları zamanda kaydırır. Rate limit modu ise seçtiğiniz seçeneğe bağlı olarak fazla mesajları ya kuyruğa alır ya da atar.

Kuyruğa Al ya da At: Asıl Önemli Karar

All messages seçeneğiyle rate limit modunda varsayılan davranış kuyruğa almaktır: hızı aşan mesajlar bellekte bekler ve tek tek serbest bırakılır. drop intermediate messages seçeneğini işaretlerseniz fazla mesajlar bunun yerine atılır. Güncel Node-RED sürümleri ara mesajları ikinci bir çıkışa gönderme seçeneği de sunar; böylece taşan mesajları başka bir yere, örneğin bir sayaca yönlendirebilirsiniz.

Her mesajın önemli olup olmadığını sorarak seçin:

  1. Her mesaj önemliyse (komutlar, olaylar, sayımlar): kuyruğa alın. Ortalama giriş hızının serbest bırakma hızının altında olduğundan emin olun, yoksa kuyruk sonsuza kadar büyür.
  2. Yalnızca en son değer önemliyse (sıcaklıklar, seviyeler, konumlar): atın ya da topic başına modu kullanın. Taze veriyi korursunuz ve bellek sabit kalır.
  3. İkisine birden ihtiyacınız varsa: taşan mesajları ikinci çıkışa gönderin ve örneğin bir ortalamaya toplayın.

Sınırsız büyüyen bir kuyruk, delay node'un klasik başarısızlığıdır. Üreticiler saatlerce serbest bırakma hızını geçerse, bellek kullanımı Node-RED yavaşlayana ya da çökene kadar tırmanır. Kuyrukları settings.js içindeki nodeMessageBufferMaxLength ayarıyla genel olarak sınırlayabilirsiniz, ancak daha iyi çözüm telemetri için atmayı seçmektir.

Örnek: Hızlı Bir Sensörü Yayınlamadan Önce Kısmak

Gürültülü bir sensörü simüle edin ve özet bir topic'te yeniden yayınlamadan önce onu iki saniyede bir mesaja kısın. Herkese açık broker'da topic'leri benzersiz tutmak için 3e5b yerine kendi rastgele dizenizi kullanın.

[
  {"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":[]}
]

Saniyede beş mesaj girer; iki saniyede bir mesaj çıkar ve bu her zaman taze bir okumadır. Sonucu bir terminalden izleyin:

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

Delay node olmadan bu akış tek bir istemciden saniyede beş mesaj yayınlardı; bu zaten herkese açık broker'ın istemci başına sınırının yarısıdır. İkinci bir sensör ekleseydiniz sınıra ulaşırdınız.

Çok Sayıda Sensör için Topic Başına Hız Sınırlama

Tek bir mqtt in node'u connectmq/demo/3e5b/+/telemetry gibi bir joker karakterle abone olduğunda, düz bir hız sınırı tüm topic'leri tek bir akış olarak ele alır. Bu durumda geveze bir sensör sessiz olanı bastırır. Delay node'u Rate limit → For each msg.topic moduna geçirin.

Bu modda node her topic için yalnızca en son mesajı tutar ve topic'ler arasında dönerek onları yapılandırılan hızda serbest bırakır. Her sensör sırasını alır ve yalnızca en son değeri gönderilir. Bir panonun ya da veritabanı yazıcısının istediği tam olarak budur. msg.topic değerinin doğru ayarlandığından emin olun; her mesaj aynı topic'e sahipse topic başına mod, tek elemanlı tek bir kuyruk gibi davranır.

Kuyruğu Çalışma Anında Kontrol Edin

Kuyruğa alma modundaki bir delay node, gelen mesajlarda özel özellikleri dinler:

Özellik Etkisi
msg.reset Hiçbir şey göndermeden kuyruğu temizler
msg.flush Kuyruktaki mesajları hemen gönderir; bir sayı verilirse o kadarını gönderir
msg.rate "allow msg.rate to override" seçeneğiyle rate limit modunda, mesajlar arasındaki milisaniye cinsinden hızı değiştirir
msg.delay Override modunda bu mesajın milisaniye cinsinden gecikmesini ayarlar

msg.reset, bir makine durduğunda faydalıdır: duruştan önceki kuyruktaki okumaların artık bir anlamı yoktur. msg.flush ise bir bağlantı geri geldiğinde ve tamponlanmış komutları bir kerede serbest bırakmak istediğinizde işe yarar. Denemek için özelliği true olarak ayarlanmış bir inject node'u bağlayın.

Uyarıları Bir Delay ile Debounce Etmek

Hız sınırları uyarı fırtınalarını da tedavi eder. Bir e-posta ya da sohbet bildirim node'undan önce, drop intermediate messages ile 10 dakikada bir mesaja ayarlanmış, hız sınırlı bir delay node'u yerleştirin. İlk uyarı hemen gider; pencere içindeki tekrarlar atılır. Cihaz başına uyarılar için msg.topic değerini cihaz kimliğine ayarlayın ve topic başına modu kullanın; böylece bir cihaz diğerinin alarmını bastıramaz. Bu mantığı kodda tutmayı tercih ederseniz, Node-RED subflow'ları rehberimizdeki bekleme süresi (cooldown) örneği aynı şeyi topic başına yapar.

Yaygın Hatalar Kontrol Listesi

  1. Telemetriyi kuyruğa almak. Yalnızca en son değer önemliyse atma ya da topic başına modu kullanın.
  2. Hız sınırını pahalı adımdan sonra koymak. Delay node'u veritabanı yazmalarından, HTTP çağrılarından ya da ağır function node'larından sonra değil, önce koyun.
  3. Eksik msg.topic. Topic başına mod, her mesajda anlamlı bir topic gerektirir.
  4. Delay ile rate limit'i karıştırmak. Delay modu her mesajı kaydırır; mesaj sayısını azaltmaz.
  5. Yanlış katmanda kısmak. Cihazlar kimsenin ihtiyaç duymadığı kadar hızlı yayın yapıyorsa, Node-RED'de veri atmak yerine firmware örnekleme hızını düzeltin.
  6. Broker sınırlarını göz ardı etmek. Broker'ınızın mesaj hızı ve boyut sınırlarını bilin ve tasarımınızı bunların altında yapın.

Kısmadan önce ya da sonra yapılacak dönüşümler için Node-RED function node rehberine, Node-RED'de MQTT bağlantılarının temelleri için ise Node-RED MQTT eğitimine bakın. Delay node'un seçenekleri yerleşik yardımda ve Node-RED çekirdek node'ları dokümantasyonunda da belgelenmiştir.

Kısılmış Veriyi ConnectMQ'ya Yayınlayın

Akışınız makul bir hızda yayın yapmaya başladığında onu özel bir broker'a taşıyın. ConnectMQ; 8883 portunda TLS, MQTT 5 mesaj sona erme süresi (message expiry) ve her kiracıyı flood'lara karşı koruyan plan bazlı kotalar sunan barındırılan bir MQTT broker'dır. Ücretsiz Serverless planı 25 bağlantıya ve 256 KB mesajlara kadar destek verir; ücretli Serverless planları ise ölçeklendiğinizde QoS 2 ve paylaşımlı abonelikler ekler. Broker'ınızı kredi kartı gerektirmeden app.connectmq.com adresinde oluşturun, ardından broker node'unu üretilen kimlik bilgilerinizle TLS'ye geçirin. Dağıtım modellerini karşılaştırmak için bulut MQTT broker rehberimizi okuyun.

Sık Sorulan Sorular

Node-RED delay node'unda delay ile rate limit arasındaki fark nedir?

Delay modu her mesajı bir süre bekletir ama her mesajı geçirir. Rate limit modu ise aralık başına kaç mesajın çıkacağını kontrol eder ve fazla olanları kuyruğa alabilir ya da atabilir.

Node-RED'de her MQTT topic'ini ayrı ayrı nasıl hız sınırlarım?

Delay node'un eylemini Rate limit olarak ayarlayın ve "For each msg.topic" seçeneğini seçin. Node topic başına en son mesajı tutar ve topic'leri sırayla yapılandırılan hızda serbest bırakır.

Bir delay node'un kuyruğunu nasıl temizlerim?

msg.reset herhangi bir değere ayarlanmış bir mesaj gönderin. Kuyruk, içindeki mesajlar gönderilmeden boşaltılır.

Delay node bellek sorunlarına neden olabilir mi?

Evet, uzun süre boyunca mesajları serbest bıraktığından daha hızlı kuyruğa alırsa. Telemetri için atma ya da topic başına modu kullanın veya kuyruk boyutunu settings.js içindeki nodeMessageBufferMaxLength ile sınırlayın.

İlgili yazılar

ISA-95 Topic'leriyle Node-RED OPC UA İstemcisinden MQTT'ye

Bir PLC veya simülasyon sunucusundaki OPC UA değişkenlerine node-red-contrib-opcua ile abone olun, node ID'lerini ISA-95 tarzı MQTT topic'lerine eşleyin ve değerleri kalite bilgisi ve zaman damgalarıyla yayınlayın.

8 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.