trigger是Node-RED中的一个常用组件,这篇文章继续结合实例介绍使用trigger进行防止抖动或者消息队列机制的方法。
以容器方式启动Node-RED服务,启动命令如下所示:
启动命令:docker run -it -p 1880:1880 -v $PWD/data:/data -e TZ=Asia/Shanghai --name nodered -d nodered/node-red:1.0.4
限速策略:消息队列 vs 消息抛弃限速必然导致数据无法及时处理完毕,对于这些消息一般有两种做法较为常见:
- 消息队列:按照消息的顺序逐条进行
- 消息抛弃:只处理一定时间段内的第一条,其余的全部抛弃
消息队列是缺省的对应方式,限速之后会对消息队列里的消息逐条处理,很多场景都是可以理解的。而消息抛弃的机制则是抛弃指定时间段内的其余信息,比如同样的操作,连续点击多次,有可能是误操作,实际上一定时间内只需要一此操作就可以了,比如代码提交引起的自动构建,无论是谁的代码提交进行的构建,对这个阶段所有的代码提交者,这次构建的结果都是可以共用的,这种情况下就完全可以使用消息抛弃的机制。比如Jenkins中在很早的版本就是使用类似的方式来控制Rush Hour的性能瓶颈。
消息队列方式 flow设定
使用如下flow来对消息队列方式的限速进行说明
-
输入消息1-3节点:以输入消息1为例,进行说明,为Inject节点的缺省设定
-
limit 1 msg/3s:使用trigger缺省设定,间隔设定为3s
- 结果显示节点:Debug节点的缺省设定
进行部署操作并,手动执行(每个Inject节点快速点击几下)确认结果如下:
和消息队列方式相比,实际上只是多选了一个复选框,详细信息如下:
flow设定
使用如下flow来对消息抛弃方式的限速进行说明
-
输入消息1-3节点:以输入消息1为例,进行说明,为Inject节点的缺省设定
-
结果显示节点:Debug节点的缺省设定
进行部署操作并,手动执行(每个Inject节点快速点击几下)确认结果如下:
[{"id":"891040ad.e0b96","type":"inject","z":"73554227.4474dc","name":"","topic":"","payload":"输入消息2","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":260,"y":160,"wires":[["c6f6eda1.50745"]]},{"id":"c6f6eda1.50745","type":"delay","z":"73554227.4474dc","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"3","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":480,"y":160,"wires":[["98da75ae.e12448"]]},{"id":"98da75ae.e12448","type":"debug","z":"73554227.4474dc","name":"结果显示","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":680,"y":160,"wires":[]},{"id":"140a50de.1f611f","type":"inject","z":"73554227.4474dc","name":"","topic":"","payload":"输入消息3","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":260,"y":240,"wires":[["c6f6eda1.50745"]]},{"id":"e7207c13.5a627","type":"inject","z":"73554227.4474dc","name":"","topic":"","payload":"输入消息1","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":260,"y":80,"wires":[["c6f6eda1.50745"]]}]