# EMQX笔记概要

作者:zhoukun 创建时间:20220228

培训结束时间:20220302

emqx官网文档链接:https://docs.emqx.com/zh/ (opens new window) 发布订阅模式参考地址:https://www.jianshu.com/p/d755909b85f8 (opens new window) MQTT协议参考地址:https://network.51cto.com/article/670429.html (opens new window)

# 背景

在罗万物联网平台的搭建过程中,由于对外需要提供鉴权的功能,我们选择了当下比较流行的消息服务引擎,一个是RocketMq,一个是Emqx进行分析选型;在研究的过程中,发现RocketMq的鉴权不是很符合我们的预期:一、RocketMq的部署流程复杂,需要掌握的知识点比较多,显得比较重量级;二、鉴权需要针对AccessValidator 接口进行另外的实现,开发可插拔的package,由于本人能力有限,没有实现该功能,有兴趣的可以自行研究下。而Emqx就显得比较轻量级,一、基于 Erlang/OTP 平台开发,而Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台;二、单节点支持百万连接,支持多种物联网协议,包括MQTT、MQTT-SN、CoAP、LwM2M、WebSocket 及私有协议等;三、ACL支持内置配置文件和外部数据源插件,外部数据源包括(MySQL (opens new window)PostgreSQL (opens new window)Redis (opens new window)MongoDB (opens new window));考虑到以后对接第三方平台,涉及的物联网协议较多,最终选择了Emqx作为公司物联网平台的消息服务中间件。

# 一、功能介绍

# 1.鉴权

# 1.流程图如下

acl-link.png

# 2.内置与外部数据源

emqx-acl鉴权 ->

# 2.连接与速率限制

  1. 当客户端连接请求速度超过指定限制的时候,暂停新连接的建立;

  2. 当客户端消息接收速度超过指定限制的时候,暂停接收消息;

  3. 速率限制可在 etc/emqx.conf 中配置

    配置项 类型 默认值 描述
    listener.tcp.external.max_conn_rate Number 1000 单节点上允许的最大连接速率 (conn/s)
    zone.external.rate_limit.conn_messagess_in Number,Duration 无限制 单连接上允许的最大发布速率 (msg/s)
    zone.external.rate_limit.conn_bytes_in Size,Duration 无限制 单连接上允许的最大报文接收速率 (bytes/s)
    listener.tcp.external.active_n Number 100 单连接上每次从 TCP 栈读取多少条消息
  4. conn_messages_inconn_bytes_in 提供的都是针对单个连接的限制,EMQX 目前没有提供全局的消息速率限制

  5. 速率限制的原理

    1. 流程图1如下

    token-bucket-algorithm-one.png

    token-bucket-algorithm-two.png

# 3.告警

  1. 官网上有详细的介绍,我这里只针对通过通过emqx的插件,将emqx的数据源输出到prometheus服务中,然后通过grafana进行可视化展示。

  2. 详情见官方文档:告警介绍

  3. emqx的插件都在/etc/emqx/plugins这个路径下,而我们需要的插件是emqx_prometheus,该插件中配置如下

    配置项名称 配置项值 描述
    prometheus.push.gateway.server http://127.0.0.1:9091 指定 Prometheus gateway 的 URI
    prometheus.interval 15000 指定 Stats 数据的收集间隔,单位: 毫秒

    # 4.消息保留

    1. 发送给服务端的消息,retain标志位需要为1,这样的话,服务端的路由在转发消息的同时,也会将消息存储在内存及硬盘中。
    2. 消息的保留需要将/etc/emqx.conf中mqtt.retain_available=true才会启用,同时需要将/etc/emqx/plugins插件下的emqx_retainer开启才会生效。
    3. 详情见官方文档:消息保留

    # 5.消息保留

    1. emqx的版本需要是4.2.0以上的版本,支持4.2.0 -> 4.2.1,4.2.2;但从4.2.0直接升级到4.3.0是不支持的,目前仅支持 Patch 版本(Patch 版本是版本号的第三位),windows,macos暂不支持热升级,版本文件需要放到/emqx/releases/的目录下,通过emqx的命令进行操作。

    2. 详情见官方文档:emqx版本热升级

# 6.使用与部署

emqx使用与部署 ->

# 小记

以上只是概叙了在我们物联网中需要使用到的功能和部分插件,emqx还有其它比较强大的功能,没有使用的插件,多种物联网协议,比如规则引擎,数据存储,功能模块等功能,期待大家去了解和探索。