EMQ-X 消息存储到数据库

EMQ-X 消息存储到数据库

使用EMQ-X 如何实现将设备上报上来的消息存储到数据库呢,方法很多,如下

EMQ-X Enterprise

购买EMQ-X企业版,有钱就用最省力的办法。
数据存储设计 • EMQ X 使用文档
在这里插入图片描述

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

方法:

  1. 后台开个超级权限的MQTT客户端
  2. 订阅所需的主题
  3. Qos设置成2,保证只接收一次,数据不会丢,也不会多
  4. 将接收到的消息存储到数据库

弊端

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

  1. 设备数越多,订阅数越多,进来的消息也越多
  2. 只有一个Socket管道的MQTT客户端压力就会很大
  3. Socket本身就不稳定,在压力大的情况下,就更容易掉线重连
    1. 如果cleanSession true,则掉线后,离线期间的数据就永久丢失了
    2. 如果cleanSession false,则重连后,broker会再推送消息过来,这时候离线期间没收到的数据全来了,压力剧增又容易再次掉线,然后开始了一个可怕的死循环

进一步解决方法

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

  1. 一个MQTT客户端的压力大,那就分流到多个MQTT客户端
  2. 分流后的消息数据再引导kafka等数据处理框架中

引用别人的一张图
在这里插入图片描述

WebHook

WebHook • EMQ X 使用文档

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

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

插件

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

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

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

Enterprise就是通过插件来实现的
在这里插入图片描述
EMQ提供了插件开发功能,参考 emqx_plugin_template 插件模版创建新的插件项目。
所以,理论上我们也是可以做到的,只是可能有点难。而且插件没写好的话,可能比上述三个方法更惨,所以要谨慎。

总结

在money不富裕的情况下,个人建议是 WebHook > MQTT客户端订阅消息再转存数据库 > 插件

在这里插入图片描述