Webinar

EMQX 6.0 技术揭秘直播|立即报名

enterprise 6.0.1 更新日志

发布日期: 2025-11-11

在升级到 EMQX 6.0.1 之前,请务必查阅不兼容变更和已知问题。

增强

消息队列

  • #16080 新增用于禁用消息队列功能的配置选项。禁用消息队列可以略微降低集群的资源使用。当持久会话也被禁用时,EMQX 将避免维护持久存储,从而进一步降低管理开销并提升性能。
  • #16096 新增支持:当客户端订阅不存在的 $q/ 主题时自动创建消息队列。现在可以通过配置项分别为常规队列和最后值语义队列启用自动创建功能。
  • #16097 优化了写入常规消息队列的性能。通过将事务追加操作替换为非事务(dirty)追加函数。对于 QoS 0 消息,现在使用异步追加操作。这些更改显著提升了写入常规队列的消息插入性能。
  • #16098 新增配置项,用于限制系统中消息队列的总数量。
  • #16152 引入每个队列的最大消息数量和消息总大小限制。同时新增了用于监控消息追加延迟的指标,有助于诊断性能问题或队列限制相关问题。

数据集成

  • #16121 将 GreptimeDB ingester 客户端升级至 v0.2.3。此版本修复了若干问题,并引入了对基于行的 gRPC 协议的支持(原来的基于列的协议已被弃用)。此外,还将 CI 镜像更新为最新稳定版本的 GreptimeDB。
  • #16127 修复了在 #16121 引入更改后,GreptimeDB 连接器中出现的无效字符串值问题。

性能

  • #15949 将监听器配置中的 parse_unit 选项默认值从 chunk 修改为 frame。当负载大小超过 socket 缓冲区(默认 4 KB)时,此更改可以显著降低 CPU 使用率。

    注意:parse_unit = frame 时,如果 PUBLISH 报文超过允许的最大大小,EMQX 将关闭连接,而不是发送 DISCONNECT 报文。

  • #16165 优化了 GET /clients_v2 API 的性能。此前,在集群中连接客户端数量达到约 50,000 或以上时,调用该 API 获取客户端列表的响应速度可能非常慢,甚至会超时。

修复

核心 MQTT 功能

  • #15884 修复了一个问题:在极少数情况下,全局路由表可能会无限期保留已长时间离开集群的节点的路由信息。
  • #15518 修复了一个竞争条件,该问题在大量共享订阅者同时断开连接时,可能导致集群中路由表和共享订阅状态持续出现不一致。

升级

  • #16047 新增支持从 EMQX 企业版长期维护版本 5.8.0 及以上版本滚动升级至 6.0。在升级过程中,旧版本的配置会自动迁移为 6.0 所支持的新格式。具体来说,已废弃的 bridges 配置根节点将转换为新的 connectorssourcesactions 配置结构。

    不过,对于 GCP PubSub Consumer 和 Kafka Consumer 的 Source,仍然需要进行手动修改。如果配置中仍包含已废弃的 topic_mapping 字段,该字段必须被移除。随后,针对原先 topic_mapping 中的每一项,需手动创建一个对应的 “Source + Rule” 配对。

安全

  • #16156 修复了一个问题:与 EMQX 5.10 相比,某些依赖缺失了默认配置,可能导致 RSA 签名验证失败。缺失的默认配置可能导致错误,例如出现以下日志消息:

    {sign_unsupported,[[{rsa_padding,rsa_pkcs1_padding}]]}, [{jose_jwa_unsupported,verify,5,[{file,"src/jwa/jose_jwa_unsupported.erl"},{line,55}]}
    
  • #16175 修复了周期性 TLS 证书垃圾回收的问题。此前,垃圾回收的执行过程错误地删除了在托管命名空间配置中仍在使用的证书文件。

访问控制

  • #16081 修复了一个问题:使用扩展认证和内存会话的客户端可能因 calling_self 错误导致触发 session_stepdown_request_exception 异常并发生崩溃。

    错误日志示例

    2025-09-24T07:13:08.973954+08:00 [error] clientid: someclientid, msg: session_stepdown_request_exception, peername: 127.0.0.1:41782, username: admin, error: exit, reason: calling_self, stacktrace: [{gen_server,call,3,[{file,"gen_server.erl"},{line,1222}]},{emqx_cm,request_stepdown,4,[{file,"emqx_cm.erl"},{line,427}]},{emqx_cm,do_takeover_begin,2,[{file,"emqx_cm.erl"},{line,398}]},{emqx_cm,takeover_session,2,[{file,"emqx_cm.erl"},{line,384}]},{emqx_cm,takeover_session_begin,2,[{file,"emqx_cm.erl"},{line,305}]},{emqx_session_mem,open,4,[{file,"emqx_session_mem.erl"},{line,210}]},{emqx_session,open,3,[{file,"emqx_session.erl"},{line,263}]},{emqx_cm,'-open_session/4-fun-1-',4,[{file,"emqx_cm.erl"},{line,290}]},{emqx_cm_locker,trans,2,[{file,"emqx_cm_locker.erl"},{line,32}]},{emqx_channel,post_process_connect,2,[{file,"emqx_channel.erl"},{line,575}]},{emqx_connection,with_channel,3,[{file,"emqx_connection.erl"},{line,852}]},{emqx_connection,process_msg,2,[{file,"emqx_connection.erl"},{line,470}]},{emqx_connection,process_msgs,2,[{file,"emqx_connection.erl"},{line,462}]},{emqx_connection,handle_recv,3,[{file,"emqx_connection.erl"},{line,406}]},{proc_lib,wake_up,3,[{file,"proc_lib.erl"},{line,340}]}], action: {takeover,'begin'}, ...
    

集群

  • #16123 修复了管理 Mria 复制的组件中的一个问题,该问题可能导致在核心-副本(core-replicant)集群中集群加入过程卡住或未完成。

    在涉及新增核心节点的集群变更过程中,这些新加入的核心节点有时无法正常启动副本节点所依赖的复制相关进程。结果,升级后的副本节点或新加入的副本节点在启动时可能会出现卡顿。

    在 Kubernetes 部署中,该问题常导致就绪探针(readiness probe)失败,从而使控制器不断重启受影响的副本节点 Pod。

    此问题通常会影响包含新增核心节点和副本节点的升级部署。例如,在一个已有 2 个核心节点和 2 个副本节点的集群中,新增 2 个运行更新版本 EMQX 的核心节点和 2 个副本节点时可能会遇到该问题。

规则引擎

  • #16028 修复了规则引擎中 jq 函数的内存泄漏问题。 此前,如果使用内置的 jq 函数 index(例如 .key | index("name")),会导致内存泄漏。

数据集成

  • #16010 修复了一个问题:如果原始规则的 SQL 未包含规则环境中的 metadata 字段,规则的备选动作可能会因 function_clause 错误而执行失败。

    错误日志示例:

    [error] tag: RESOURCE, msg: failed_to_trigger_fallback_action, reason: {error,function_clause}, fallback_kind: republish, primary_action_resource_id: <<"action:type:name:connector:type:name">>, republish_topic: <<"republish/topic">>
    
  • #16046 修复了一个潜在的内存溢出(OOM)崩溃问题:当加载或重启包含数百个动作的连接器配置时,可能导致崩溃。

  • #16140 修复了一个 Redis 集群故障转移(failover)相关的问题,该问题可能导致连接器长时间停留在 “connecting” 状态。

    此前,EMQX 的 Redis 集群客户端仅在常规查询(如 GET)失败时才会刷新集群拓扑结构。然而,周期性发送的 PING 命令即使失败,也不会触发刷新操作。因此,在发生故障转移后,如果没有其他命令被发送,连接器可能会继续使用过时的拓扑信息,导致无法恢复连接。

    此次修复后,PING 命令失败也会触发集群拓扑刷新,确保连接器能够及时检测到故障转移并恢复正常工作。

MQTT 会话持久化

  • #16105 此修复优化了持久存储性能,尤其是减少了使用持久会话的客户端的 CONNACK 延迟。
  • #16129 持久存储事务配置现在可以在运行时更改。以前,修改此配置需要重启节点。

可观测性

  • #15963 减少了在远程 shell(remsh)中进行循环评估时产生的过多审计日志。

  • #15967 修复了一个问题:在清理大量审计日志时,Mnesia 事务阻塞可能导致内存迅速增长。

  • #16060 修复了一个日志格式化器崩溃的问题,该问题可能发生在某些包含深度嵌套的非 ASCII 字符的调试级别日志消息中。

    错误日志示例

    2025-09-29T06:55:34.120640+00:00 debug: FORMATTER CRASH: {report,#{request => #{messages => [#{role => <<"user">>,content => <<"{\"msg\": \"hello\"}">>}],system => <<"将输入的 JSON 数据中,值为数字的 value 相加起来,并输出,只需返回输出结果。"/utf8>>,model => <<"claude-3-haiku-20240307">>,max_tokens => 100},msg => emqx_ai_completion_request}}
    2025-09-29T06:55:34.120780+00:00 [debug] formatter_crashed: emqx_logger_textfmt, config: #{time_offset => [],chars_limit => unlimited,depth => 100,single_line => true,template => ["[",level,"] ",msg,"\n"],with_mfa => false,timestamp_format => auto,payload_encode => text}, log_event: #{meta => #{line => 44,pid => <0.281254.0>,time => 1759128934120640,file => "emqx_ai_completion_anthropic.erl",gl => <0.4317.0>,mfa => {emqx_ai_completion_anthropic,call_completion,3},report_cb => fun logger:format_otp_report/1,matched => <<"t/1">>,namespace => global,clientid => <<"c_emqx">>,trigger => <<"t/1">>,rule_id => <<"r1sczoo0">>,rule_trigger_ts => [1759128934120]},msg => {report,#{request => #{messages => [#{role => <<"user">>,content => <<"{\"msg\": \"hello\"}">>}],system => <<"将输入的 JSON 数据中,值为数字的 value 相加起来,并输出,只需返回输出结果。"/utf8>>,model => <<"claude-3-haiku-20240307">>,max_tokens => 100},msg => emqx_ai_completion_request}},level => debug}, reason: {error,badarg,[{erlang,iolist_to_binary,[["[",[["messages",": ",[[91,[[35,123,[["role"," => ",[60,60,"\"user\"",62,62]],44,["content"," => ",[60,60,"\"{\\\"msg\\\": \\\"hello\\\"}\"",62,62]]],125]],93]]],", ",["system",": ","将输入的 JSON 数据中,值为数字的 value 相加起来,并输出,只需返回输出结果。"],", ",["model",": ","claude-3-haiku-20240307"],", ",["max_tokens",": ","100"]],"]"]],[{error_info,#{module => erl_erts_errors}}]},{emqx_trace_formatter,format_term,2,[{file,"emqx_trace_formatter.erl"},{line,126}]},{emqx_logger_textfmt,format_term,2,[{file,"emqx_logger_textfmt.erl"},{line,230}]},{emqx_logger_textfmt,try_encode_meta,4,[{file,"emqx_logger_textfmt.erl"},{line,206}]},{lists,foldl_1,3,[{file,"lists.erl"},{line,2151}]},{emqx_logger_textfmt,enrich_report,3,[{file,"emqx_logger_textfmt.erl"},{line,102}]},{emqx_logger_textfmt,format,2,[{file,"emqx_logger_textfmt.erl"},{line,24}]}]}
    
  • #16134 修复了一个向后兼容性问题,该问题在某些情况下可能导致无法创建新的日志追踪。

速率限制

  • #16160 改进了针对单个客户端连接的速率限制算法。此前,客户端在刚连接后或经过一段时间不活动后,可能会短暂地超出其发布速率限制。此次更新使限速行为更加可预测且一致,确保从连接建立开始就能正确执行速率限制。