如何在 MQTT 中对消息进行排队?
How can I queue messages in MQTT?
我在 IoT 应用程序中使用 MQTT。为此,每个物联网设备将在其主题下向物联网代理发布数据,处理服务器将订阅一些通配符主题以访问数据。该处理服务器需要将此数据保存在数据库中。现在的情况是,在某一时刻,数千或数百万台设备将发布到代理。如果处理服务器访问数据,在它完成处理之前,它就会被下一个数据蜂拥而至。我该如何解决?我希望在客户端或代理端可以有一些类似队列的机制。如果是这样,如何做到这一点?或者我应该使用其他协议而不是 MQTT?
假设消息的速率恒定,如果订阅客户端不能比消息到达更快地处理它们,那么在订阅客户端或代理中排队将无济于事。这只会导致内存泄漏,最终会耗尽所有可用内存并使应用程序崩溃,可能会丢失消息。
MQTT 通常不支持在线客户端的消息排队。对于以大于 QOS 0 订阅的客户端,可以通过控制客户端如何在 QOS 握手过程中向代理确认消息来在代理中排队消息,但正如我所说,这只会导致他们支持在代理中,直到它耗尽内存。能否做到这一点还取决于您使用的客户端库。
正确的解决方案可能是拥有多个处理客户端并使用称为共享订阅的东西来确保每条消息仅传递给单个处理器。共享订阅是在 v5 中添加到 MQTT 规范的一项功能。有关共享订阅的更多信息,请参见 here
我在 IoT 应用程序中使用 MQTT。为此,每个物联网设备将在其主题下向物联网代理发布数据,处理服务器将订阅一些通配符主题以访问数据。该处理服务器需要将此数据保存在数据库中。现在的情况是,在某一时刻,数千或数百万台设备将发布到代理。如果处理服务器访问数据,在它完成处理之前,它就会被下一个数据蜂拥而至。我该如何解决?我希望在客户端或代理端可以有一些类似队列的机制。如果是这样,如何做到这一点?或者我应该使用其他协议而不是 MQTT?
假设消息的速率恒定,如果订阅客户端不能比消息到达更快地处理它们,那么在订阅客户端或代理中排队将无济于事。这只会导致内存泄漏,最终会耗尽所有可用内存并使应用程序崩溃,可能会丢失消息。
MQTT 通常不支持在线客户端的消息排队。对于以大于 QOS 0 订阅的客户端,可以通过控制客户端如何在 QOS 握手过程中向代理确认消息来在代理中排队消息,但正如我所说,这只会导致他们支持在代理中,直到它耗尽内存。能否做到这一点还取决于您使用的客户端库。
正确的解决方案可能是拥有多个处理客户端并使用称为共享订阅的东西来确保每条消息仅传递给单个处理器。共享订阅是在 v5 中添加到 MQTT 规范的一项功能。有关共享订阅的更多信息,请参见 here