当尝试将所有消息转储到数据库时,HiveMQ的博客在“最佳实践”下列出了不订阅多级通配符的内容。他们声称,订阅客户端可能无法跟上大量消息,并建议使用代理插件直接挂接到消息流中。


有时有必要订阅所有通过代理传输的消息,例如,将所有消息持久保存到数据库中时。这不应通过使用MQTT客户端并订阅多级通配符来完成。原因是,订阅客户端通常无法处理即将发送的消息负载。尤其是如果您的吞吐量很高。我们推荐的解决方案是在MQTT代理中实现扩展,例如,HiveMQ的插件系统使您可以了解HiveMQ的行为,并添加异步例程来处理每条传入的消息并将其持久化到数据库中。

是否有用于mosquitto代理的类似系统(扩展/插件),
另一种推荐的与mosquitto一起使用的方法,或者
合理的证据表明这种方法根本没有必要,也就是说,订购#的客户可以做到吗?


https://stackoverflow.com/q/31584613/3984613并未详尽地解决这个问题。

#1 楼


mosquitto经纪人的类似系统(扩展/插件)


据我所知,mosquitto经纪人没有插件/扩展(至少没有开源的)


推荐的另一种适用于mosquitto的方法


根据我在Mosquitto经纪人和AWS IoT方面的经验,我可以说,您可以直接订阅'#'

合理的证据

看了这个问题之后,我有点好奇地知道吞吐量限制并找出是否需要扩展系统。因此,我进行了以下设置:



作为虚拟终端设备的100个AWS Lambda函数将一些随机数据发送到网关(EC2实例t2.nano 500MB RAM)
每60个触发了秒功能以将数据发布到不同主题的网关(lambdatoec2 / {VariableTopicNumberFrom1-100}
EC2实例正在运行Mosquitto 1.4.10

到目前为止,我看到有订阅#没有任何扩展系统都没有问题。但是我仍然必须测试一些极端情况(一旦测试它们,我将更新答案)。

评论


“正确”的答案是测试。如果可以证明通过将订户添加到#中,系统的性能受到了不利影响,请重新配置代理以禁止#订。我赞成这个答案,因为@bravokeyl正是这样做的。

–约翰·迪特斯
17年1月3日在18:06

#2 楼

关于openHAB邮件列表的讨论似乎表明,使用#作为订阅来接收所有消息没有问题:



在对MQTT设备进行故障排除时,我发现有时我。有没有办法做到这一点?


有人在蚊子名单上为您回答了这个问题;使用
通配符。 (#)


此堆栈溢出问题也建议使用相同的方法:


订阅#可让您订阅除主题以外的所有内容以$开头(无论如何,这些通常都是控制主题)。

当然,最好知道您首先要订阅的内容,并且请注意,某些代理配置可能不允许明确订阅#。


正如Bence Kaulics所指出的,该规范确实指出#是有效的:


非规范性注释

>
“#”有效,并且将收到每条申请消息。




老实说,我质疑原始声明是否真的有意义:


原因是订阅的客户端通常无法处理即将发送的消息。


如果是这种情况,如何经纪人可以首先处理这些消息吗?只要您的客户端具有与代理类似的性能特征,我就强烈怀疑是否有可能使客户端不堪重负,因为这种流量也将使代理不堪重负,并首先导致崩溃。

总而言之,HiveMQ的主张似乎并没有得到其他来源的大量证据的支持,并且当您考虑其实际含义时,似乎并不合乎逻辑。

#3 楼

我认为重要的是要考虑到MQTT经纪人有许多不同的用例,就像任何软件一样。 )与客户端数量少但消息率高的系统不同,并且两者都与家庭自动化系统不同(客户端少,消息率低)。

HiveMQ正在考虑非常高的客户端/消息率应用程序-在这种情况下,代理的功能几乎可以肯定远远超过客户端的功能。您可以检查在任何情况下代理是否都在使用过多的CPU。

和其他答案一样,订阅#将为您提供所有“正常”主题,这是所有不会开始的内容带有#。我将规范解释为说,以$开头的每个主题本身都是一棵单独的树,因此您必须订阅$$SYS/#才能获得所有内容。对于普通应用程序,您极有可能不想这样做。