参考:https://huaweicloud.csdn.net/637ef707df016f70ae4cae49.html

1、MQTT客户端订阅消息再转存数据库

方法:

  1. 后台开个超级权限的MQTT客户端

  1. 订阅所需的主题

  1. Qos设置成2,保证只接收一次,数据不会丢,也不会多

  1. 将接收到的消息存储到数据库

弊端

这个方法是最简单的,目前在很多开源的物联网项目中看到都是这么用的,但是它的弊端也很明显。

  1. 设备数越多,订阅数越多,进来的消息也越多

  1. 只有一个Socket管道的MQTT客户端压力就会很大

  1. Socket本身就不稳定,在压力大的情况下,就更容易掉线重连

  1. 如果cleanSession true,则掉线后,离线期间的数据就永久丢失了

  1. 如果cleanSession false,则重连后,broker会再推送消息过来,这时候离线期间没收到的数据全来了,压力剧增又容易再次掉线,然后开始了一个可怕的死循环

进一步解决方法

办法总比问题多,是个问题总能解决

  1. 一个MQTT客户端的压力大,那就分流到多个MQTT客户端

  1. 分流后的消息数据再引导kafka等数据处理框架中

2、WebHook

WebHook • EMQ X 使用文档

了解WebHook之前需要先连接Hook,钩子 • EMQ X 使用文档

WebHook 对于事件的处理是单向的,它仅支持将 EMQ X 中的事件推送给 Web 服务,并不关心 Web 服务的返回。 借助 Webhook 可以完成设备在线、上下线记录,订阅与消息存储、消息送达确认等诸多业务。

3、插件

Enterprise实现数据存储的方式就是通过插件来实现的,而插件的核心又是钩子

所以,看到这里大家就会很奇怪,那么WebHook插件差别在哪呢。

  • WebHook是在消息进来的某个钩子节点时,发送HTTP请求到某个Web服务,在Web服务里面执行我们想要的数据存储功能

  • 插件是在消息进来的某个钩子节点时,插入一段代码,执行我们想要的数据存储功能

Enterprise就是通过插件来实现的

EMQ提供了插件开发功能,参考 emqx_plugin_template 插件模版创建新的插件项目。

所以,理论上我们也是可以做到的,只是可能有点难。而且插件没写好的话,可能比上述三个方法更惨,所以要谨慎。

4、总结

在考虑费用的情况下,建议的方案选择顺序是: WebHook > MQTT客户端订阅消息再转存数据库 > 插件

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐