增强
集群连接
- #13126 新增了集群连接功能,使多个独立的 EMQX 集群可以互相连接和通信。此功能支持在地理位置分散的集群间实现高效的消息交换,提升 MQTT 部署的灵活性和扩展能力。
核心 MQTT 功能
- #13009 将因速率限制导致消息接收暂停的日志级别从
debug
更新为warning
。为了避免过多日志输出,对日志消息socket_receive_paused_by_rate_limit
进行了日志节流。
认证与授权
#12418 增强了 JWT 认证功能,支持使用对象列表来进行声明验证:
[ { name = "claim_name", value = "${username}" }, ... ]
预期值现在作为模板处理,与其他认证器保持一致,允许使用
${username}
和${clientid}
等任意表达式。之前,只支持插值固定的"${username}"
和"${clientid}"
值。改进了
verify_claims
参数的文档。#13229 在认证模板中添加了对
${cert_pem}
占位符的支持。#13324 EMQX Dashboard 现在可以与支持 OIDC 协议的身份服务集成,例如 Okta,以实现基于 OIDC 的单点登录(SSO)。
- #13534 添加了日志追踪,用于记录超级用户绕过授权检查的情况。
- #13601 EMQX 支持 Kerberos 认证,该认证使用 GSSAPI 机制(基于 Kerberos V5 的 SASL-GSSAPI)。此增强功能允许 MQTT 客户端和服务器使用
GSSAPI-KERBEROS
方法在不安全的网络上进行安全认证。
数据集成
#13144 修改了日志级别,将桥接缓冲区溢出且消息被丢弃时的日志消息
data_bridge_buffer_overflow
从info
级别更改为warning
级别,并增加了日志节流。之前,这些事件的日志记录级别为info
,在默认日志设置下不可见。#13492 增强了
GET /connectors
和GET /connectors/:id
接口,现在这些接口返回使用特定连接器的动作和 source 的列表。此外,GET /actions
、GET /sources
、GET /actions/:id
和GET /sources/:id
接口现在返回与特定动作或 source 关联的规则列表。#13505 在 HTTP API 中新增了根据数据集成动作或源的 ID 过滤规则的功能。
#13506 在所有已包含
peerhost
字段的规则引擎事件中引入了peername
字段。peername
字段是一个格式为IP:PORT
的字符串。#13516 在
republish
动作中添加了direct_dispatch
参数。当
direct_dispatch
设置为true
(或通过模板渲染为true
)时,消息将直接发送给订阅者,避免触发其他规则或重复激活相同的规则。#13573 在客户端连接事件和消息
publish
事件的 SQL 上下文中引入了client_attrs
。用户现在可以在规则 SQL 语句中访问客户端属性,例如SELECT client_attrs.attr1 AS attribute1
,并在数据集成动作中使用${attribute1}
。#13640 为规则添加了两个新的 SQL 函数:
coalesce/2
和coalesce_ne/2
。这些函数简化了在规则 SQL 表达式中处理空值的过程。例如,之前需要使用以下表达式:
SELECT CASE WHEN is_null(payload.path.to.value) THEN 0 ELSE payload.path.to.value END AS my_value
现在可以使用更简洁的表达式:
SELECT coalesce(payload.path.to.value, 0) AS my_value
。#12959 为 Kafka 生产者连接器引入了一个新选项,可以配置专用于健康检查的主题。此功能能够更精确地检测与分区 leader 的连接问题,例如错误或缺失的凭据可能会阻止建立连接。
#12961 添加了一个配置选项,可以提前自定义 Kafka Consumer source 的消费组 ID。
#13069 EMQX 支持与 Azure Blob Storage 的数据集成。
#13199 新增了消息转换功能。该功能允许用户仅使用简单的 variform 语法即可转换和丰富传入的消息,而无需在规则引擎中定义 SQL 规则。
使用示例: 假设您收到一条 Avro 格式编码的消息,您希望将其解码为 JSON 格式。解码后,您想在将消息发送到规则引擎处理之前,将一个
tenant
属性(从发布客户端的客户端属性中检索)添加到主题前面。通过此新功能,您可以使用以下配置来实现此转换:message_transformation { transformations = [ { name = mytransformation failure_action = drop payload_decoder = {type = avro, schema = myschema} payload_encoder = {type = json} operations = [ {key = "topic", value = "concat([client_attrs.tenant, '/', topic])"} ] } ] }
此配置指定了一个名为
mytransformation
的转换,它:- 使用指定的 schema 将消息负载从 Avro 格式解码。
- 将 payload 编码为 JSON 格式。
- 将客户端属性中的
tenant
属性与原始主题连接,从而在进一步处理之前修改主题。
#13415 EMQX 支持与 Couchbase 的数据集成。
#13463 增强了 GCP PubSub 生产者动作,当从 PubSub 接收到 HTTP 状态代码 502(Bad Gateway)或 503(Service Unavailable)时,自动重试请求。重试将持续进行,直到请求成功或消息的生存时间(TTL)到达。
#13546 为 Pulsar 生产者动作添加了一个可配置的查询模式选项,允许用户在数据发送到 Pulsar 服务之前自定义数据查询方式。
#13650 EMQX 支持与 DataLayers 的数据集成。
运维
- #13202 引入了
emqx ctl conf cluster_sync fix
命令,用于解决集群配置不一致的问题。该命令将所有节点的配置与具有最高tnx_id
的节点的配置进行同步,确保集群配置的一致性。 - #13250 为
cluster.discovery_strategy
添加了一个新的值:singleton
。选择此选项后,将不会形成集群,并且节点将拒绝与其他节点之间的连接尝试。 - #13370 为持久存储添加了新版
wildcard_optimized
存储布局,提供了以下改进:- 新布局没有固有的延迟。
- MQTT 消息被序列化为更节省空间的格式。
- #13524 添加了
emqx ctl exclusive
CLI 界面以更有效地管理排它订阅主题。该功能使管理员能够更好地管理和排查排它主题订阅问题,确保订阅状态准确反映并防止意外故障。 - #13597 添加了轻量级的封装函数,供插件自行存储和管理证书文件。此修复措施防止插件证书被证书垃圾回收(GC)功能意外删除。
- #13626 添加了一个新命令
emqx ctl listeners enable <Identifier> <Bool>
用于启用/禁用监听器。 - #13493 将 RPC 库
gen_rpc
升级到 3.4.0 版本。此更新将默认的 RPC 服务器套接字选项从true
更改为active-100
,在 RPC 服务器负载较重时对对等节点引入了反压机制。 - #13665 在 Prometheus 端点中新增了一个指标
emqx_actions_count
。该指标包含所有规则添加的动作数量,包括重发布(Republish)动作和控制台输出(Console Output)动作。
修复
核心 MQTT 功能
- #12944 修复了当客户端使用非 UTF-8 编码的 client ID 且
strict_mode=false
时导致连接崩溃的问题。 - #13006 改进了对保留消息、延迟消息和接管会话消息的验证,确保它们遵循通过正则表达式匹配实现的客户端 ID 封禁规则。此前,一些由于网络问题而延迟的消息或被其他会话接管的消息可能会绕过这些客户端 ID 封禁规则。
认证与授权
- #13024 添加了默认 ACL 拒绝规则以拒绝订阅
+/#
主题模式。由于 EMQX 默认拒绝订阅#
主题,为了完整性,它也应该拒绝+/#
。 - #13040 改进了 HTTP 认证:
- 改进了在 HTTP 请求中缺少或无法识别
Content-Type
头时的错误日志记录,提供了更详细的诊断信息。 - 修复了在认证 HTTP 请求中导致查询参数双重编码的问题。
- 改进了在配置为使用 POST 方法和 JSON 内容类型的认证请求中,当 JSON 模板无法渲染为有效 JSON 时的错误提示。此类情况通常发生在模板包含类似
${password}
的占位符但收到非 UTF-8 编码的密码输入时,改进后提高了透明度并简化了调试过程。
- 改进了在 HTTP 请求中缺少或无法识别
- #13196 为内置授权数据库添加了限制,将每个客户端或用户的权限列表(ACL)规则数量限制为默认的 100 条。
- #13584 修复了创建 HTTP 授权时,当 HTTP 头列表为空时导致错误的问题。
- #13618 改进了
authorization/sources
端点的类型规范,以提供更清晰和简洁的错误消息。 - #13624 修复了内置数据库授权检查器中的一个问题,即在更新客户端或用户的规则时,可能导致规则总数超出
max_rules
限制。 - #13678 使删除链中认证器的操作幂等化,确保即使删除的认证器不存在,该操作也能成功。
数据集成
- #13207 优化了
republish
规则引擎动作,以更准确地反映消息发布的成功和失败情况。此前,即使republish
动作未能将消息传递给所有订阅者,成功指标仍然会增加。现在,如果检测到消息未能到达任意一个订阅者,失败指标将正确增加。 - #13425 改进了 MQTT 连接器的错误日志信息,提供了更清晰和更详细的信息。
- #13589 修复了一个问题,该问题允许通过 HTTP API 创建 ID 为字符串
"null"
的规则,这可能导致配置不一致。 - #13414 改进了 RabbitMQ 连接器错误日志信息,提供了更清晰和更详细的信息。
文件传输
- #12514 修复了文件传输命令结果报告到
$file-response/${clientid}
通道的问题。此前,如果通道发出assemble
命令后在组装过程完成之前断开连接,状态消息将丢失且不会发送到响应主题。现在,组装状态由专用进程监控,即使原始通道断开连接,也能确保状态消息可靠传递。
运维
- #13078 改进了 EMQX 管理 API 中的验证和错误处理,以确保 JSON 请求体的请求包含
Content-Type: application/json
头。如果预期为 JSON 输入的 API 缺少此头,服务器现在会正确返回415 Unsupported Media Type
状态码,而不是400 Bad Request
。 - #13225 增强了认证和授权 API 的安全性,通过屏蔽密码等敏感数据。此前,API 可能在响应中返回原始密码值。此次更新后,敏感信息将被替换为
******
,以防止意外泄露并保护用户凭据。
网关
- #13607 修复了通过 API 显示的 CoAP 订阅的 QoS 等级与实际使用的 QoS 等级不匹配的问题。这种不一致可能导致混淆,因为成功的订阅未能在 Dashboard上准确反映。