更新日志

Release date: 2020-01-18

Introduction

在这个版本中,我们通过重构会话和通道显著地提高了代理的吞吐量,通过添加更多的hooks和计数器改进了可扩展性和可监控性,重新设计了规则引擎SQL来主要根据主题过滤消息/事件。在REST api、身份验证插件和MQTT客户机方面也有很多改进。

The Broker

  • 提高了代理的吞吐量::

    Session进程被删除。现在,所有关于会话和连接的逻辑都放到了单个进程中。这极大地提高了代理的吞吐量。**在我们的一个基准测试中,我们在一个具有16个CPU核心的节点上实现了QoS0消息的最大吞吐量100万TPS。另一项测试显示,emqx能够在一个节点上处理200万个并发连接,并且只使用大约17G内存**。有关更多信息,请参见emqx v4.0.0的基准测试报告。

  • 优化了对MQTT数据包的处理:

    对MQTT包的处理进行了很大的更改,以使代码基更简洁。有关更多信息,请参见模块emqx_channel。

  • 改进的指标:

    我们重命名了一些计数器,也增加了更多的计数器:

    • client.connect
    • client.connack
    • client.connected
    • client.authenticate
    • client.check_acl
    • client.subscribe
    • client.unsubscribe
    • client.disconnected
    • session.created
    • session.resumed
    • session.takeovered
    • session.discarded
    • session.terminated
  • 改善了 hooks:

    我们修改了一些 hooks 的参数,增加了更多的 hook-points:

    • client.connect: MQTT CONNECT Packet Received
    • client.connack: MQTT CONNACK Packet Sent
    • client.connected: The MQTT Client is connected
    • client.disconnected: The MQTT Client is disconnected
    • client.authenticate: Authenticate the MQTT Client
    • client.check_acl: Check Pub/Sub ACL
    • client.subscribe: MQTT SUBSCRIBE Packet Received
    • client.unsubscribe: MQTT UNSUBSCRIBE Packet Received
    • session.created: A new session is created
    • session.subscribed: After session subscribed a topic
    • session.unsubscribed: After session unsubscribed a topic
    • session.resumed: A session is resumed
    • session.takeovered: A session is takeovered
    • session.discarded: A session is discarded
    • session.terminated: A session is terminated
    • message.publish: A message is published
    • message.delivered: A message is delivered
    • message.acked: A messaeg is acked
    • message.dropped: A message is dropped due to no subscribers
  • 修正了SSL握手失败会导致进程崩溃的问题:

    以保护进程崩溃,并在SSL握手失败时给出可读的错误日志消息。

  • 修复了max_subscriptions不能工作的问题: emqx/emqx#2908

  • 修正了跨集群转发时出现的消息无序问题:

    节点间消息通过多个RPC通道发送,默认选择通道的策略是随机的。这将导致相同主题的消息在发送到其他节点后出现顺序混乱。在这个修复中,我们将默认策略更改为按主题的哈希值。

  • Fixed the issue that REST API and CLI cannot get multiple routes for a topic:

  • 修正了REST API和CLI不能为一个主题获取多个路由的问题: emqx/emqx-management#150.

REST API

  • 在REST API中支持IPv6:

    现在所有的REST API都支持IPv6。

  • HTTP API服务器的默认监听端口从8080改为8081:

    旧的 HTTP API 默认8080端口很容易与同一节点上运行的其他服务发生冲突。我们把默认值改为8081。

  • 重新设计用于会话和连接的api

  • 支持在订阅API中返回共享订阅的真实主题:

  • 支持配置默认的AppID和AppSecret:

    现在默认的AppID和AppSecret可以在etc/emqx_management.conf 中配置。

  • 发布消息的HTTP API现在支持base64编码的有效载荷:

    有些用户可能希望通过HTTP API发布二进制消息。通过这个特性,他们可以通过发送一个base64编码的有效负载来实现这一点。

  • 修正了URI编码处理不正确的问题

身份认证插件

  • 支持在配置文件中定义HTTP请求头。

  • 支持在配置文件中配置默认的clientids和用户名:

    该特性已从 EMQ X V3.0中删除,现在再次添加。

MQTT 客户端 (emqtt)

  • emqtt为发布和订阅提供了命令行接口。

规则引擎 (emqx-rule-engine)

  • 重新设计的规则引擎的SQL:

    规则引擎的SQL在它的FROM子句中做了一点更改。旧的语法是这样的:

    SELECT * FROM "message.publish"

    现在改为:

    SELECT * FROM "t/#"

    因此,它现在主要根据主题过滤消息/事件。如果主题不匹配,此更改将阻止规则引擎处理SELECT子句,从而提高了性能。