Skip to content

emqx

EMQX

  • 概览

    • EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计;
    • EMQX 支持多种协议,包括 MQTT (3.1、3.1.1 和 5.0)、HTTP、QUIC 和 WebSocket 等
    • 单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息,同时保证毫秒级的低时延。
  • 默认情况下,EMQX 启动时会占用 7 个端口

    • 1883,用于 MQTT over TCP 监听器,可通过配置修改
    • 8883,用于 MQTT over SSL/TLS 监听器,可通过配置修改
    • 8083,用于 MQTT over WebSocket 监听器,可通过配置修改
    • 8084,用于 MQTT over WSS (WebSocket over SSL) 监听器,可通过配置修改
    • 18083,HTTP API 服务的默认监听端口,Dashboard 功能也依赖于这个端口,可通过配置修改
    • 4370,用于 EMQX 分布式集群远程函数调用、Mnesia 数据同步等。
    • 5370,用于分担上一端口压力的集群 RPC 端口,主要用于节点间转发 MQTT 消息。与 4370 端口类似,即便没有组成集群,这个端口也会被默认占用
  • 概念解析

    • source:数据源的配置,主要是配置数据源在哪里
    • sink: 数据发到何处,这里一般配当前emqx
    • rule: source数据到sink的规则
    • Flows:数据流图,可以看到source,sink 和rule
  • 实操

    • 创建source
      • 目标emqx的用户名和密码需要提前创建
      • 主题是关注的topic,也就是数据的来源
      • 配置完成后,测试连接,会弹出需要创建规则的,这里先不要创建规则。
    • 创建sink
      • sink 也就是数据的去处,这里也就是当前这个emqx的一些配置
    • 创建rule
      • 选择source ,创建规则
      • 这样就可以把source的信息带入进去,要不然需要手写
      • 选择sink 之后,直接添加就好
      • 可以看到sink,至于sql 是复杂的规则,当前的需求是做数据的同步
    • check flow
      • 点击Flows菜单,可以看到数据流
      • 点击创建好的规则,可以看到数据统计的情况
      • 可以看到数据,再做一次订阅,看看当前emqx是否能订阅到数据
  • 总结

    • source,sink ,rule 名字不好改,在创建的时候就要写好,提前规划
    • sink的topic 是${topic} 是原样转发,要注意
    • 提前创建好bridge的权限
  • 常见问题

    • EMQX 与物联网应用的关系是什么?

      • EMQX 位于数据采集这一层,分别与硬件和数据存储、分析进行交互,是物联网应用的核心;
      • 前端的硬件通过 MQTT 协议与位于数据采集层的 EMQX 交互,通过 EMQX 将数据采集后,通过 EMQX 提供的数据接口,将数据保存到后台的持久化平台中(各种关系型数据库和 NOSQL 数据库);
      • 上层应用通过这些数据分析后得到的结果呈现给最终用户。
    • EMQX 是一个开源的 MQTT 消息服务器,并且 MQTT 是一个 TCP 协议栈上位于应用层的协议;

    • EMQX 的主题数量有限制吗?

      • 主题使用没有数量限制,主题数量增长对性能影响不大,可以放心使用。
    • MQTT 协议与 HTTP 协议相比,有何优点和弱点?

      • MQTT 协议为长连接协议,每个客户端都会保持一个长连接。MQTT 协议在维护连接的时候会发送心跳包;
      • HTTP 协议是一个无状态的协议,每个 HTTP 请求为 TCP 短连接;
      • 低带宽、低功耗。MQTT 在传输报文的大小上与 HTTP 相比有巨大的优势,因为 MQTT 协议在连接建立之后,由于避免了建立连接所需要的额外的资源消耗,发送实际数据的时候报文传输所需带宽与 HTTP 相比有很大的优势;
      • 发送一样大小的数据,MQTT 比 HTTP 少近 50 倍的网络传输数据,而且速度快了将近 20 倍;
      • 收消息的场景,MQTT 协议的耗电量为 HTTP 协议的百分之一,而发送数据的时候 MQTT 协议的耗电量为 HTTP 协议的十分之一;
      • MQTT 提供消息质量控制(QoS),消息质量等级越高,消息交付的质量就越有保障,在物联网的应用场景下,用户可以根据不同的使用场景来设定不同的消息质量等级
    • 什么情况下需要通过 WebSocket 去连接 EMQX 服务器?

      • WebSocket 是一种在基于 HTTP 协议上支持全双工通讯的协议,可以在浏览器端直接实现对主题的订阅和消息发送等操作。
    • 什么是 mqueue?如何配置 mqueue?

      • mqueue 是 EMQX 在消息发布流程中保存在会话中的一个消息队列;
      • 当 MQTT 连接报文中的 clean session 设置为 false 的时候,即使是客户端断开连接的情况下,EMQX 也会为断连客户端保存一个会话;
      • 这个会话会缓存订阅关系,并代替断开连接的客户端去接收订阅主题上的消息,而这些消息会存在 EMQX 的 mqueue 中,等到客户端重新上线再将消息重新发给客户端
      • EMQX 默认不缓存 qos 0 的消息,mqueue 在 EMQX 中是可以配置的,通过配置 mqtt.mqueue_store_qos0 = true 可以将 qos0 消息也存在 mqueue 中;
      • 通过配置项 mqtt.max_mqueue_len ,可以确定每个会话缓存的消息数量。注意,这些消息是存储在内存中的,所以尽量不要将 mqueue 长度限制修改为 0(设置为 0 代表 mqueue 长度没有限制);
    • 什么是代理订阅?使用场景是什么?

      • 通常情况客户端需要在连接到 EMQX 之后主动订阅主题。代理订阅是指服务器为客户端订阅主题,这一过程不需要客户端参与,客户端和需要代理订阅的主题的对应关系保存在服务器中。
      • 使用代理订阅可以集中管理大量的客户端的订阅,同时为客户端省略掉订阅这个步骤,可以节省客户端侧的计算资源和网络带宽。
    • EMQX 能把接入的消息转发到 Kafka 吗?

      • 能。目前 EMQX 企业版提供了内置的 Kafka 桥接方式,支持把消息桥接至 Kafka 进行流式处理。EMQX 使用 Kafka 参照 Sink - Apache Kafka。
    • 可以把 MQTT 消息从 EMQX 转发其他消息中间件吗?例如 RabbitMQ?

      • EMQX 支持转发消息到其他消息中间件,通过 EMQX 提供的桥接方式就可以做基于主题级别的配置,从而实现主题级别的消息转发。请参考数据集成。
    • EMQX 向订阅者转发消息的时候能否保证原始顺序?

      • EMQX 会保证来自同一客户端的相同主题的消息按照到达顺序被转发,这与消息的 QoS 等级无关,QoS 等级不会影响转发顺序。
      • 不管消息丢失还是重复,也都不会导致消息失序。这也是 MQTT 协议所要求的。
    • 当我遇到客户端连接、发布、订阅相关的问题时应该怎么办?

      • EMQX 的 Debug 日志基本记录了所有的行为和现象,通过阅读 Debug 日志我们能够知道客户端何时发起了连接,连接时指定了哪些参数,连接是否通过,被拒绝连接的原因是什么等等。
      • EMQX 也提供了日志追踪功能,我们可以指定想要追踪的客户端或主题,EMQX 会将所有与该客户端或主题相关的 Debug 日志都输出到指定日志文件中。
      • 如果客户端是因为网络原因而无法连接到 EMQX 的话,日志追踪功能也是无法提供帮助的,因为此时 EMQX 尚未收到任何报文。这种情况很多时候是因为防火墙、安全组等网络配置原因导致服务器端口没有开放;