queue - 如何在 MQTT 中排队消息?
问题描述
我在 IoT 应用程序中使用 MQTT。为此,每个物联网设备将在其主题下将数据发布到物联网代理,并且处理服务器将订阅一些通配符主题以访问数据。该处理服务器需要将此数据保存在数据库中。现在的问题是,有一次,成千上万的设备将发布到代理。如果处理服务器访问数据,在它完成处理之前,它被下一个数据蜂拥而至。我该如何解决?我希望在客户端或代理端可以有一些类似队列的机制。如果是这样,如何做到这一点?或者我应该使用其他协议而不是 MQTT?
解决方案
假设消息的速率恒定,如果订阅客户端不能比它们到达更快地处理它们,那么在订阅客户端或代理中将它们排队将无济于事。这只会导致内存泄漏,最终会消耗所有可用内存并使应用程序崩溃,可能会丢失消息。
MQTT 通常不支持在线客户端排队消息。对于订阅大于 QOS 0 的客户端,可以通过控制客户端如何将消息确认给代理作为 QOS 握手的一部分,在代理中对消息进行排队,但正如我所说,这只会导致他们支持直到它耗尽内存。能否做到这一点还取决于您使用的客户端库。
正确的解决方案可能是拥有多个处理客户端并使用称为共享订阅的东西来确保每条消息仅传递到单个处理器。共享订阅是在 v5 中添加到 MQTT 规范中的一项功能。有关共享订阅的更多信息,请参见此处
推荐阅读
- python - 如何从 sqlalchemy 数据库返回烧瓶中的文件
- reactjs - 你可以使用在元素中包含字符串数据的 React 状态吗?
- android - 如何为 Toolbar 和 BottomAppBar 充气两个不同的菜单
- api - Json msg NoSuchMethodError:在 null 上调用了方法“[]”
- javascript - 如何在网站中呈现浮动文本?
- laravel - 登录/注册后如何将用户重定向到特定路由?
- python - 为什么我在使用 pip 安装 Azure-CLI 时出错
- javascript - 放置一个变量并在单个弹出窗口中添加变量的值
- 使用 Vuejs
- c++ - constepxr 是否暗示内联
- r - 用于锚定ggplot geom_smooth回归(黄土)的起点和终点的aes参数?