Webinar

EMQ「技术之夏」直播季火热来袭!| 立即报名

enterprise 5.8.1 更新日志

升级前请查看已知问题列表和不兼容变更列表。

重要变更

  • #13956 RPC 库 gen_rpc 升级到 3.4.1,修复一个竞争导致的节点崩溃问题。在此版本前,如果某个节点在 RPC 通道建立过程中关闭,可能会导集群中致对等节点崩溃。

增强

核心 MQTT 功能

  • #13525 新增了配置项 shared_subscription_initial_sticky_pick,用于在 shared_subscription_strategysticky 时第一次选取共享订阅客户端的策略。

  • #13942 HTTP 客户端现在在最新请求超时后,如果 10 秒内未检测到任何活动,将自动重新连接。此前,客户端会无限期等待服务器响应,导致服务器丢弃请求时发生超时。

    此更改影响以下组件:

    • HTTP 认证
    • HTTP 授权
    • Webhook(HTTP 连接器)
    • GCP PubSub 连接器(企业版)
    • S3 连接器(企业版)
    • InfluxDB 连接器(企业版)
    • Couchbase 连接器(企业版)
    • IoTDB 连接器(企业版)
    • Snowflake 连接器(企业版)

认证与授权

  • #13863 EMQX 现在支持在原始 ACL 规则的主题名称模板中使用 ${cert_common_name} 占位符。

  • #13864 增加了在 LDAP 查询过滤器中使用 memberOf 语法的支持。

  • #13810 新增了 client-info 认证。

    Client-info(类型为 cinfo)认证是一种轻量级的认证机制,它通过检查客户端属性和自定义规则来进行认证。这些规则使用 Variform 表达式定义匹配条件以及匹配后的认证结果。例如,为了快速屏蔽没有用户名的客户端,可以设置匹配条件为 str_eq(username, ''),并关联检查结果 deny

  • #13792 黑名单查询 API GET /banned 现支持使用以下参数对规则进行查找:

    • clientid
    • username
    • peerhost
    • like_clientid
    • like_username
    • like_peerhost
    • like_peerhost_net

    在新增黑名单记录时,对于未指定 until 参数的默认过期时间已从 1 年改为 无限期

规则引擎

  • #13773 停用的规则动作现在不会触发 out_of_service 警告。

    之前,如果某个动作被停用,会出现带有 msg: out_of_service 的警告日志,并且该规则的 actions.failed 计数器会增加。

    经过此次优化后,停用的动作将记录 debug 级别日志,日志内容为 msg: discarded,并且新增的 actions.discarded 计数器将增加。

  • #13804 支持使用 Confluent Schema Registry 作为外部 Schema 提供者与 EMQX 的 Schema Registry 集成。

数据集成

  • #13716 引入了 IoTDB 连接器的 Thrift 驱动。

  • #13745 EMQX 现已支持与 Snowflake 的数据集成。

  • #13783 在 Kafka 生产者处于异步模式下运行时,降低了缓冲区内存的使用量。

  • #13861 为部分数据集成动作添加了一个新的配置项 undefined_vars_as_null,用于确保当数据写入数据库时,SQL 模版中未定义的占位符变量将被替换为 NULL

    以下 Sink 动作添加了此配置项:

    • MySQL
    • ClickHouse
    • SQLServer
    • TDengine
    • DynamoDB

MQTT over QUIC

  • #13814 基于 QUIC 多流的连接范围保活功能:

    此更新引入了一项新功能,即使控制流处于空闲状态,但其他数据流仍活跃时,仍然可以保持基于 QUIC 多流的 MQTT 连接。

    之前,客户端需要在空闲的控制流上发送 MQTT.PINGREQ 来保持连接活跃。现在,每个连接都会维护一个共享状态,监控所有流的活动情况。这个共享状态有助于判断连接是否仍然活跃,减少由于队头阻塞(HOL blocking)导致的保活超时风险,并提高整体连接的稳定性。

MQTT 会话持久化

  • #13788 当相应功能被禁用时,防止 DS 共享订阅应用程序执行完整的启动流程。这也避免了初始化内部数据库,进而防止占用大量磁盘空间。

集群连接

  • #13835 新增了 PUT /cluster/links/link/:name/metrics/reset HTTP API 端点,用于重置指定集群连接的指标。

Dashboard

  • #13873 提升了 /api/v5/monitor 端点的性能。

    此更新改善了 Dashboard 监控页面的性能,特别是在拥有大量节点的集群中,之前常出现超时问题。

    主要改进包括:

    • 实现了并发的 RPC 调用,从集群中的各个节点检索指标数据。
    • 引入了数据降采样机制,根据查询的时间范围减少数据点密度:
      • 最近 1h 的数据间隔为 10s
      • 最近 1d 的数据间隔为 1m
      • 最近 3d 的数据间隔为 5m
      • 最近 7d 的数据间隔为 10m
    • 为 EMQX 停止运行的时段添加了虚拟数据点,确保在 Dashboard 的时间轴上清晰显示这些间隙。

企业版 License

  • #13910 优化了企业版 License 检查的性能。

修复

核心 MQTT 功能

  • #13702 修复节点宕机时清理该节点持有的排它订阅。

  • #13708 修复了可能导致共享订阅的 “sticky” 策略降级为 “random” 的问题。

  • #13733 在使用 emqx ctl conf load 命令配置 https 监听器时,允许 cacertfile 参数为可选项。

  • #13742 修复了客户端在订阅主题 #+ 时,会收到以 $ 开头的主题的保留消息的问题。

  • #13754 修复了 websocket 连接会自行持续中断的问题。

  • #13756 增加了分配给客户端 ID 的随机性。

  • #13790 将 MQTT 连接器的默认心跳间隔从 300 秒减少到 160 秒。

    此更改有助于通过防止因负载均衡器或防火墙的空闲限制导致的超时来维护底层 TCP 连接,云服务提供商通常将这些限制设定在 3 到 5 分钟之间。

  • #13832 修复了启用持久会话时,Publish 端点出现 500 错误的问题。

  • #13842 修复了 UTF-8 字符串验证异常问题。

  • #13956gen_rpc 库更新至 3.4.1 版本,该版本包含一个修复,防止客户端 socket 初始化错误升级到服务端的节点级别。

升级与迁移

  • #13731 解决了运行在 EMQX 5.4.0 的集群无法升级到 EMQX 5.8.0 的问题。此修复引入了一个迁移过程,将 5.4.0 版本中创建的特定内部数据库表更新为符合新架构。

认证

  • #13726 升级了 Kerberos 认证库,改为使用 MEMORY 类型缓存,替代之前的 FILE 类型缓存,解决了在并发初始化认证请求时可能导致的失败问题。

规则引擎

  • #13735 改进了在解码无效 payload 时的消息转换错误提示。
  • #13769 修复了使用带有 extends 属性的 JSON Schema 验证(draft 3)时,总是导致验证失败的问题。

数据集成

  • #13851 修复了使用 IoTDB Thrift 驱动时,Test connectivity 测试连接出现异常的问题。

  • #13724 现在,在聚合模式下,Azure Blob Storage 和 S3 动作在达到最大记录数量后,会更快触发发送聚合数据。

  • #13734 优化了 Azure Blob Storage 连接器配置时的错误提示,使其更加友好。

  • #13736 升级了 Kafka 生产者,支持客户端重新认证。详见 kafka_protocol#122

    同时修复了以下问题:

    • 修复了 PR#13727wolff#74 中的 unexpected_info 错误日志。
    • 修复了 Kafka 连接中由于竞态条件导致的 einval 崩溃报告,详见 kafka_protocol#124
  • #13896 将 Pulsar 客户端从 0.8.3 升级至 0.8.4(详见 pulsar#61)。

    在此修复之前,如果生产者客户端遇到 “socket error”(而非正常的“socket close”),它可能会继续向已关闭的 socket 发送数据且没有错误处理。用户在 EMQX Dashboard 上可能会观察到 “total” 计数器持续增加,但“success”、“failed” 和 “dropped” 计数器不增加。

  • #13897 Microsoft SQL Server 连接器现已兼容 Microsoft ODBC 18。

  • #13902 修复了 MySQL 集成中预处理语句的问题。

    在此修复之前,如果在更新 MySQL 集成动作时使用了无效的预处理语句(例如引用了未知的表列名),可能会导致动作恢复为使用最早版本的预处理语句。

  • #13906 修复了 PostgreSQL 集成中预处理语句的问题。

    在此修复之前,如果在更新 Postgres 集成动作时使用了无效的预处理语句(例如引用了未知的表列名),可能会导致动作恢复为使用最早版本的预处理语句。

  • #13921 修复了 Pulsar 生产者动作中更改 sync_timeout 参数未按预期生效,未能正确影响请求超时的问题。

    此外,弃用了 Pulsar 生产者动作中的 resource_opts.request_ttl 配置,因为该配置未能如预期那样影响请求 TTL(实际由 retention_period 控制)。这一更改有助于防止用户产生混淆。

  • #13959 将 Pulsar 客户端从 0.8.4 升级到 0.8.5(参见 pulsar#62)。此更新修复了一个问题,在某些竞争条件下,生产者可能无法与客户端进程通信,导致客户端进程意外停止且不会自动重启。之前唯一的解决方法是手动重启该进程。

  • #13965 修复了在 IoTDB Sink 中使用批量模式作为数据写入方式时出现的函数子句错误。
  • #13971 修复了 EMQX Enterprise 5.8.0 中引入的 Kafka 生产者错误,生产者在初始化阶段如果未能获取元数据,可能会崩溃。
  • #13973 修复了 Microsoft SQL Server 集成中的一个问题,EMQX 在每次与服务器的连接断开时会记录多条错误和警告日志。

管理和运维

  • #13963 修复了审计日志功能中的以下问题:
    • 审计日志功能与单点登录(SSO)功能不兼容,导致每个 SSO 事件都会引发异常。
    • 非法访问尝试(例如,对仅支持 POST 的端点发起 GET 请求)未被记录。

集群连接

  • #13888 修复了无法通过 HTTP API 更新没有 clientid 的集群连接的问题。
  • #13927 修复了当本地集群中包含一个或多个高度拥挤的主题时,集群连接引导过程可能会崩溃的问题。