如何在 MQTT 中对消息进行排队?

fre*_*r90 5 queue mqtt mosquitto iot

我在 IoT 应用程序中使用 MQTT。为此,每个物联网设备将在其主题下将数据发布到物联网代理,并且处理服务器将订阅一些通配符主题以访问数据。该处理服务器需要将该数据保存在数据库中。现在的问题是,一次性有数千或数百万台设备将发布到代理。如果处理服务器访问数据,在完成处理之前,它就会被下一个数据淹没。我该如何解决?我希望客户端或代理端可以有一些类似队列的机制。如果是这样,该怎么办?或者我应该使用其他协议而不是 MQTT?

har*_*llb 7

假设消息的速率恒定,如果订阅客户端无法比消息到达的速度更快地处理它们,那么在订阅客户端或代理中对它们进行排队并没有什么帮助。这只会导致内存泄漏,最终会消耗所有可用内存并使应用程序崩溃,甚至可能丢失消息。

MQTT 通常不支持在线客户端的消息排队。对于以大于 QOS 0 订阅的客户端,可以通过控制客户端在 QOS 握手过程中向代理确认消息的方式来对代理中的消息进行排队,但正如我所说,这只会导致他们支持在代理中,直到内存耗尽。能否执行此操作还取决于您使用的客户端库。

正确的解决方案可能是拥有多个处理客户端并使用称为共享订阅的东西来确保每条消息仅传递到单个处理器。共享订阅是 v5 版本中添加到 MQTT 规范的一项功能。有关共享订阅的更多信息可以在此处找到