后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载EMQX 插件在集群环境下安装后配置会通过集群配置同步cluster config sync机制在节点间复制。本变更fix-16784.en.md修复了单节点部署时的一个日志噪音问题启动阶段不再尝试从本地节点获取插件配置从而消除了重复出现的config_not_found_on_node警告。阅读本文后你将理解该警告的产生原理、修复前后的行为差异以及fresh_install与normal两种插件配置模式在源码中的实际处理路径。问题背景config_not_found_on_node警告从何而来EMQX 的插件配置与插件安装包一样都属于集群级资源。在集群中安装一个插件后其配置会写入集群配置cluster config当集群中其他节点同步该配置、或在启动时恢复插件状态时会尝试从集群中获取该插件的配置。获取配置的实现位于 emqx_plugins.erl 的get_config_from_any_node/3emqx_plugins.erl#L1283-L1302它会依次向候选节点发起 RPC 调用emqx_plugins_proto_v2:get_config/5当某个节点返回?plugin_conf_not_found哨兵值时记录{Node, config_not_found}并继续尝试下一个节点。在旧版本的单节点部署中集群配置同步流程会把本地节点也作为候选节点去查询插件配置。由于新安装或尚未在集群中启用过的插件在本节点不存在对应的集群配置条目每次查询都会命中配置不存在分支于是启动期间反复打印config_not_found_on_node警告——这在单节点场景下既无实际意义又污染了日志。核心修复启动阶段不再从本地节点拉取插件配置本变更的修复逻辑非常直接EMQX 不再在集群配置同步期间尝试从本地节点获取插件配置从而避免启动时重复出现config_not_found_on_node警告。该修复意味着无论集群规模如何从本地节点查询插件配置这一步骤被彻底移出配置同步路径。对于单节点部署而言插件配置不再需要从其他节点复制——因为根本不存在其他节点对于多节点集群而言本地节点上若存在配置直接使用本地已同步的配置即可无需再通过一次注定失败的 RPC 查询来确认。这一行为变更同样记录在 6.0.3.en.md 与 6.1.1.en.md 的发布说明中属于跨版本统一的修复行为。源码视角两种配置模式的实现差异要理解修复的落地方式需要关注ensure_local_config/2的两个分支——fresh_install与normal模式。模式常量定义在 emqx_plugins.hrl-define(fresh_install, fresh_install).normal模式从集群节点复制配置do_ensure_local_config/2 的?normal分支体现了集群配置同步的完整路径do_ensure_local_config(NameVsn, ?normal) - case peer_nodes() of [] - emqx_plugins_local_config:copy_default(NameVsn); Nodes - case get_config_from_any_node(Nodes, NameVsn, []) of {ok, Config} when is_map(Config) - emqx_plugins_local_config:update(NameVsn, Config); {error, Errors} - log_config_not_found(NameVsn, Errors), emqx_plugins_local_config:copy_default(NameVsn) end end.其中peer_nodes/0emqx_plugins.erl#L1588-L1589通过mria:running_nodes()枚举集群运行节点并显式排除本地节点peer_nodes() - [N || N - mria:running_nodes(), N / node()].关键点在于候选节点集合Nodes本身就不包含本地节点N / node()过滤。因此在单节点部署中peer_nodes()必然返回空列表[]直接走copy_default/1分支——从插件 tarball 中复制默认配置根本不会发起任何跨节点配置查询自然也就不会产生config_not_found_on_node警告。fresh_install模式全新安装跳过集群查找do_ensure_local_config/2 的fresh_install分支更彻底——完全跳过集群查询直接写入默认配置do_ensure_local_config(NameVsn, ?fresh_install) - emqx_plugins_local_config:copy_default(NameVsn);这正是全新安装fresh install语义的体现一个刚安装、从未在集群中运行过的插件理论上不可能在其他节点存在有效配置因此任何集群查找都是徒劳的只会制造噪音。日志降级从 warning 到 debug即使查询确实发生且全部失败日志行为也经过了优化。log_config_not_found/2emqx_plugins.erl#L1591-L1606会对错误进行分类当所有节点都返回config_not_found时记录为debug 级别提示语为plugin_config_not_found_in_cluster并附带说明 This is expected when this plugin has not been started in the cluster before——即插件尚未在集群中启动过属预期行为仅当出现非配置不存在类的真实错误如 RPC 失败、节点不可达时才记录为 warning 级别的failed_to_get_plugin_config_from_cluster。这意味着即使在某些边界场景下仍会发起集群查询只要结果属于预期中的未找到也不再以 warning 级别刷屏。配套演进CLI 与 HTTP API 统一使用fresh_install模式与本次修复同源的另一个变更fix-17932.en.md同时记录于 6.1.4.en.md 与 6.2.3.en.md将插件安装入口统一到了fresh_install模式emqx ctl plugins install命令emqx_plugins_cli_utils.erl#L306调用emqx_plugins:ensure_installed(NameVsn, ?fresh_install)HTTP API 的插件安装接口emqx_mgmt_api_plugins.erl#L859、L881同样使用?fresh_install而ensure_installed/1普通路径emqx_plugins.erl#L364-L373及reinstall/1emqx_plugins.erl#L382-L387走?normal模式仍保留从集群复制配置的能力。这样一来全新安装的插件在任何节点上都跳过集群配置查找配合本次修复彻底消除了每次在集群各节点启动时重复打印config_not_found_on_node警告的问题。测试验证仓库测试 emqx_plugins_SUITE.erl 中针对该行为有明确覆盖t_cli_install_no_warning/1emqx_plugins_SUITE.erl#L2392-L2404以?fresh_install模式安装演示插件后断言插件状态为config_status : disabled即已安装但未启用验证全新安装不触发集群配置查找t_fresh_install_skips_peer_config/1emqx_plugins_SUITE.erl#L2424从测试命名即可看出其目的正是验证fresh_install模式跳过 peer 节点配置查询。对运维与开发者的影响单节点部署升级后启动日志不再被config_not_found_on_node警告刷屏日志更干净排障时更容易聚焦真正的错误多节点集群新加入的节点在同步插件配置时不会因本地缺少配置而反复告警插件尚未在集群中启用时相关提示降级为 debug 级别可按需通过日志级别配置查看API 行为一致性CLI 与 HTTP API 的安装行为对齐均为fresh_install语义安装即disabled状态避免两条入口行为不一致带来的困惑。该修复不改变插件配置的最终同步结果无论走copy_default还是从集群节点复制插件安装完成后都会得到一份可用的本地配置改变的只是获取方式与告警级别属于纯体验层面的优化不影响功能正确性。如需深入了解完整实现可继续阅读 emqx_plugins.erl 中的install_and_configure/3与configure/3emqx_plugins.erl#L1204-L1221它们串联了安装 → 校验配置 schema → 确保本地配置 → 应用本地配置 → 更新状态的完整链路。赞分享后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载相关推荐用 Decompose 30 分钟搭一个能进能退的跨平台清单应用路由导航与状态管理实战用 Decompose 30 分钟搭一个能进能退的跨平台清单应用路由导航与状态管理实战 Decompose 是一个面向 Kotlin Multiplatfor移动开发跨平台状态管理零配置部署EMQX边缘节点自动组网与配置同步实战零配置部署EMQX边缘节点自动组网与配置同步实战 你是否还在为物联网边缘设备的分布式部署烦恼手动配置节点、反复同步参数、网络波动导致集群分裂——这些问题正在后端物联网消息队列通信15分钟部署EMQX集群Docker Compose多节点配置实战15分钟部署EMQX集群Docker Compose多节点配置实战 为什么需要EMQX集群 物联网IoT应用中单节点MQTT Broker消息代理后端物联网消息队列通信创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
