从Mosquitto/EMQX到国产MQTT Broker:选型、许可证与迁移实战

发布时间:2026/9/14 15:53:06
从Mosquitto/EMQX到国产MQTT Broker:选型、许可证与迁移实战 1. 先搞清楚你为什么想换掉 Mosquitto / EMQXMQTT 协议本身只有薄薄几十页规范真正决定系统稳定性的是那层负责连接管理、消息路由、QoS 语义和权限控制的“协议栈实现”——也就是我们常说的 broker。很多团队一开始用 Mosquitto 做原型验证业务量上来之后换 EMQX 支撑大规模连接后来又因为许可证、功能边界、商业化策略等各种原因开始考虑替代方案。先说一次我实际经历过的选型过程。当时我们做一套工业 IoT 平台设备端有几千个 DTU 通过 4G 模块走 MQTT 上报数据最开始用的是 Mosquitto部署在单台 4C8G 的云主机上连接数和消息量都不大跑得很稳。后来设备规模扩展到两万多台还要支持遗嘱消息、保留消息、共享订阅这些高级特性Mosquitto 就显得有点吃力尤其是规则转发这块我们需要把特定主题的数据实时推到 Kafka在 Mosquitto 里得额外写一套桥接脚本维护成本越来越高。于是我们开始评估 EMQX但评估过程中发现EMQX 的开源版虽然功能强大可真正好用的企业版特性——比如数据集成、多租户管理、大规模集群监控——并不是免费开放的而且它的商业化路线越来越明显这让我们不得不重新思考依赖一个商业项目是否稳妥。这就是我写这篇文章的出发点当你在评估“用一款国产 MQTT 协议栈替换 Mosquitto 或 EMQX”的时候表面上比的是吞吐量、连接数、协议支持程度实际上比的是三件事——许可证能否支撑你的商用场景、项目是否长期维护、以及团队是否有能力在出问题的时候自己兜底。文章后面我会把主流的国产方案、许可证差异、迁移步骤和常见坑都拆开讲适合正在做技术选型或者被现有 broker 的授权问题困扰的团队参考。1.1 MQTT 协议栈到底解决什么问题经常有同学把“MQTT 协议栈”和“MQTT 客户端库”搞混。客户端库是跑在设备端或者服务端的 SDK负责把消息打包、发送、接收比如 Paho、MQTT.js、HiveMQ Client 这类。而协议栈或者叫 broker是运行在服务器上的独立服务负责维护所有客户端的连接状态、处理订阅关系、转发消息、执行 QoS 语义。我用一个生活化的类比来解释MQTT 客户端就像一部手机protocol 负责规定打电话的格式和流程而 broker 就是电信运营商的交换机。手机之间无法直接通话所有语音都要经过交换机交换机处理多少路并发通话、能不能保证通话质量、通话记录怎么留存这些问题都由交换机决定。对应到 MQTT 场景broker 决定的是单机可以支撑多少 TCP 长连接连接状态的内存占用模型是怎样的消息路由效率和主题匹配算法在大规模通配符订阅下的性能表现QoS 1/2 的语义是否完整实现会话状态session state如何持久化遗嘱消息LWT、保留消息retained message、共享订阅shared subscription这些 MQTT 规范之外的重要扩展是否支持与外部系统集成的能力比如能否直接转发到 Kafka、数据库中。理解了这个层级关系,你就能明白为什么“换 broker”并不是一个很复杂的客户端改造工程。只要客户端严格遵循 MQTT 3.1.1 或 5.0 规范切换到任何符合规范的 broker设备端代码基本可以一行不改。真正的替换成本在于服务端的运维体系、配置策略、二次开发和团队知识迁移。1.2 Mosquitto 和 EMQX 的优势与痛点Mosquitto 是 Eclipse 基金会维护的轻量级 broker用 C 语言实现最大的优势是极简、稳定、资源占用极低。我在树莓派上跑过 Mosquitto128MB 内存的设备上依然可以稳定运行非常适合边缘网关场景。但它的问题也很明显单机性能上限不高官方提供的集群方案很弱基本上要靠桥接模式自己搭Web 管理界面缺失没有内置的规则引擎和数据集成能力。如果只是一个几百台设备的项目Mosquitto 是足够用的一旦规模上来运维同学就要频繁手工调整配置文件也不是不行但非常考验耐心。EMQX 是另一个路线基于 Erlang/OTP 的软实时特性单机可以撑百万级连接原生支持集群、规则引擎、数据桥接、Dashboard 监控。它 4.x 时代开源版采用 Apache 2.0 许可证功能相对完整很多团队从官方文档就能获得不错的体验。但 EMQX 5.x 之后的版本开源版和企业版的功能边界被划得非常清楚比如多集群联邦、数据集成里的部分连接器、专业的运维告警能力都需要企业版授权。对于个人学习或者中小团队开源版完全够用对于有营收压力的商业公司许可证边界就成了一个需要专业法务参与评估的问题。1.3 什么时候才真正需要“替代”我的建议是不要为了“国产替代”而替代也不要因为某个 broker 热度高就盲目迁移。真正促使团队做替换的场景通常是以下四种许可证风险当前使用的 broker 许可证条款与公司的商业模式冲突比如使用了 GPL 传染性协议的组件、或者企业版功能被误用存在法律风险必须更换商业策略不匹配上游项目的开源策略、版本规划、社区治理模式让团队感到不确定担心未来被绑定或功能受限性能或功能瓶颈当前 broker 在特定场景下无法满足要求比如单主题消息量极大、需要共享订阅、需要多租户隔离等团队技术栈适配比如团队全面转向 Go 或 Java希望 broker 的技术栈与团队能力匹配方便二次开发和定制。如果只是“觉得国产的更安全”而没有具体问题要解决那我不建议迁移——平滑运行的系统最有价值任何迁移都会引入新的风险。2. 国产 MQTT broker 有哪些可选方案国内开源的 MQTT broker 项目其实不少但它们的发展和维护状态差异很大有些已经停止维护有些还在活跃迭代。我这里只分享真正上过生产环境、社区里有一定口碑的几个方向覆盖面不会特别广但足够给大家做选型参考。2.1 BifroMQ百度开源的高性能多租户 brokerBifroMQ 是我目前最推荐优先评估的国产开源实现。它基于 Java 开发吸收了百度内部 IoT 平台的实战经验在架构设计上有很多值得借鉴的地方。最核心的特点是天然支持多租户可以在单个集群内为不同业务线创建隔离的租户空间每个租户的连接数、主题数、消息量都有独立的配额管理这让它特别适合做内部中台或者对外提供 IoT PaaS 服务的团队。从协议支持层面看BifroMQ 完整支持 MQTT 3.1.1 和 5.0包括遗嘱消息、保留消息、共享订阅、主题别名等特性。我曾经用 5000 个客户端同时连接、每个客户端每秒发布 10 条 QoS 1 消息做过压测BifroMQ 的 CPU 占用和内存增长都在合理范围内消息延迟维持在个位数毫秒级。它的部署也很干净官方提供了 Docker 镜像和 Helm Chart单机模式部署一条命令就能跑起来。有一点需要提醒BifroMQ 的定位是“broker 内核”它不像 EMQX 那样开箱即用地提供大量的规则引擎和可视化编排组件更像一个高性能的消息路由器。这意味着你需要在它外面搭建自己的认证服务、数据转发链路。如果你是冲着“功能全面”去选型BifroMQ 的体感会偏“底层”一些如果你需要的是一个稳定高效的底座它有明显优势。2.2 gmqttGo 生态的轻量级选择gmqtt 是 Go 语言实现的一个 MQTT broker 库同时也提供了可执行的 broker 程序。它的优势在于 Go 语言带来的部署便利性和并发模型一个二进制文件扔到服务器上就能跑内存占用比 Java 系要低不少非常适合边缘节点、小规模集群或需要二次开发深度定制的场景。如果你是 Go 技术栈的团队gmqtt 的插件化设计会让你很有亲切感。官方提供了用于接入外部鉴权服务的钩子hook机制你可以在客户端连接时调用自建 HTTP API 校验用户名密码或 token也可以在消息发布时做自定义的消息过滤和改写。这一点在实际项目中非常重要因为商业场景几乎没有直接用 broker 内置用户名密码表的需求基本都要对接公司统一的认证中心。需要特别说明的是gmqtt 的维护节奏并不算特别活跃它更像是一个“社区驱动”的项目功能迭代取决于发起团队的业务需求。使用前一定要认真核对它当前支持的 MQTT 版本和功能列表。我在前年用 0.4.x 版本时它还不支持 MQTT 5.0 的完整特性但这不一定是问题取决于你的设备协议版本。2.3 自研方案Netty / gRPC 等基础库组合有些团队会考虑基于 NettyJava或 gRPC 自己实现一套协议解析和转发逻辑也就是“自研协议栈”。这里我要给大家泼一盆冷水不要轻易选择这条路。MQTT 协议规范虽然不复杂但真实环境中的“协议正确性”远比读一遍 RFC 要难得多。比如 QoS 2 的“四步握手”中消息去重的 session state 管理、客户端断线重连的会话恢复、主题通配符 和 #在大量订阅时的路由性能、遗嘱消息在非正常断连和客户端主动断开两种场景下的不同处理逻辑这些细节只有在长时间、高并发、多版本客户端混杂的环境下才会暴露出来。网上随便搜一下都能找到不少自研 broker 在低概率场景下出现重复消息、消息丢失或者内存泄漏的案例。我的建议是除非你的团队里有对 MQTT 协议规范理解很深的人并且有充足的时间做协议一致性测试比如用 HiveMQ 的协议验证工具做完整测试否则优先使用成熟开源项目做底座在业务逻辑层面做二次开发。自研成本看着省了授权费实际上人力投入远超授权成本。2.4 各方案基础能力横向对比这里把几个主要方向放在一张表里方便大家根据自己场景快速筛选。对比维度MosquittoEMQX 开源版BifroMQgmqtt开发语言CErlangJavaGoMQTT 3.1.1支持支持支持支持MQTT 5.0支持较晚版本支持支持视版本而定集群能力弱依赖桥接原生集群能力强原生集群多租户需自行实现管理界面无完善 Dashboard基础信息接口无规则引擎/数据集成无部分支持企业版更全弱需自建弱需自建许可证EPL/EDLApache 2.0开源版Apache 2.0Apache 2.0适合场景边缘/小规模大规模 IoT大规模 IoT/多租户边缘/Go 技术栈这里我想重点强调一下单看功能列表选型是远远不够的还要看项目背后的团队和治理模式。“开源”意味着代码开放不意味着“有求必应”。一个一年只更新两三次、issue 响应慢的项目用起来心里始终不踏实。3. 开源版权与商用风险深度对比这一节是很多人最容易忽略、但真出了事最头疼的部分。很多人下载一个开源 broker 用起来以为“能用就行”但不同的开源许可证对商业使用的限制差异非常大。我尽量用通俗的方式把许可证的差异和风险点讲清楚帮助大家避免踩坑。3.1 许可证基础EPL、Apache 2.0、木兰的区别先科普一下最常见的几种许可证的核心条款差异。EPLEclipse Public License是一种弱 copyleft 许可证Mosquitto 同时使用 EPL 和 EDL 双重许可。EPL 的核心要求是如果你修改了 EPL 代码本身并且以某种方式对外分发比如卖设备、提供包含修改版的下载那么你有义务把修改后的源码开源。但如果你只是把 Mosquitto 作为一个独立服务跑在自己的服务器上没有对外分发代码那 EPL 的限制基本不会触发。这就是为什么很多公司以“软件即服务”的方式使用 Mosquitto是完全没有问题的。Apache 2.0是目前对商用最友好的许可证之一EMQX 开源版和 BifroMQ 都使用它。它允许你自由使用、修改、分发代码甚至可以把它集成到闭源商业产品里出售唯一的要求是保留版权声明和许可声明并注明你对代码做的修改。对于绝大多数商业公司来说Apache 2.0 几乎是零负担的。木兰Mulan是国内推出的开源许可证目前有 Mulan PSL v1/v2 等多个版本。它的设计充分考虑了与 Apache 2.0 的兼容性核心条款类似同样允许商用、允许闭源分发但要求保留版权声明。有些国内开源项目会使用木兰协议你在选型时需要特别留意因为国际社区对木兰的熟悉程度不如 Apache虽然有兼容性保障但生态成熟度仍然有差距。3.2 Mosquitto 和 EMQX 的许可证陷阱这一节我结合实际经验说几个团队容易踩的许可证陷阱。第一个陷阱混淆 GPL 与 EPL。网上有些文章把 Mosquitto 说成“GPL 协议”这是不准确的——GPL 和 EPL 虽然在 copyleft 强度上有相似之处但细节不同。Eclipse 基金会官方对 Mosquitto 的许可描述是“dual-licensed under the EPL and the EDL”所以引用资料时一定要以官方仓库的 LICENSE 文件为准。如果博客上一知半解的人转述有误照单全收就容易出问题。第二个陷阱EMQX 开源版和企业版的功能边界不清晰。Apache 2.0 是开源版的许可证但 EMQX 官方同时发布了企业版并提供了企业版专有功能。如果你在生产环境中使用了本应属于企业版的功能例如某些数据连接器或集群运维插件严格来说是不被允许的。这里面的灰色地带在 EMQX 的文档里并不总是标注得特别清楚我的经验是上生产环境前把用到的每一个插件、每一个功能在官方文档里确认一遍许可证说明做到心里有数。第三个陷阱误以为“开源”等于“可无限制商用”。无论哪种开源许可证都会有一些边界。比如 Apache 2.0 中包含一个“专利授权”条款它要求如果你以某个方式使用软件并形成专利侵权诉讼你将失去该许可证下所有专利授权。听起来很绕总结一句话如果你用这些开源软件做产品又回头起诉这些项目的贡献者侵犯了你的专利那你的软件授权会自动终止。对大多数普通公司来说不会触发但技术出身的人容易忽略这一层。3.3 国产协议栈的授权风险控制那是不是换成国产项目就一定安全不是的国产项目同样有四件事需要特别核查。许可证是否明确。有些项目仓库里没有 LICENSE 文件或者写着“保留所有权利”那就是变相的“不能商用”。代码在 GitHub 上并不等于允许你使用没有许可证的代码在法律上默认是“保留所有权利”的状态这一点很多开发者都会忽略。商业友好度是否经历过大厂验证。BifroMQ 来自百度内部开源gmqtt 来自商业公司它们在内部业务里都经历过大规模流量考验。相比个人维护的小项目这种“背靠大厂”的项目在商业可靠性上更有保证当然也要具体看团队的投入情况。依赖组件的许可证污染。这是最隐蔽的坑。broker 本身是 Apache 2.0但它依赖的某个库如果是 GPL 协议那么整个软件的许可证状态就会变得复杂。选型时除了看项目自己的 LICENSE还要花时间梳理它的直接依赖树。好在 GitHub 和 Maven/NuGet 等仓库都提供了依赖清单可以借助工具自动扫一遍。知识产权归属。如果供应商或开源社区要求你在某地登记版权或专利这类附加约束需要法务介入评估。我建议选型阶段就引入法务而不是等产品上线后再补课。4. 迁移实战从 Mosquitto / EMQX 切到国产实现选型完成之后真正的硬仗在于迁移。很多团队迁移失败不是因为新 broker 性能不够而是忽略了消息语义、认证体系和运维监控的无缝衔接。这一节我会按照实际操作顺序把迁移路径拆开讲。4.1 客户端层无感迁移的前提MQTT 客户端连接 broker 的过程就是简单的 TCP 加 MQTT 握手所以只要设备端遵循 MQTT 3.1.1 或 5.0 规范切换 broker 对设备来说是无感的。这里有几个前提条件连接地址和端口不变。如果你的设备是硬编码了 broker 的 IP 和端口那迁移时要保持端口一致或者使用域名做转发把旧地址解析到新 broker。认证方式兼容。设备端原来的用户名密码、客户端 ID、TLS 证书配置在新 broker 上要能继续使用。如果新 broker 走的是完全不同的认证协议比如 JWT 认证那就需要设备端同步改版这对于存量设备多的场景是巨大的成本。主题命名空间不变。无论 broker 怎么换主题就是业务消息的“地址”千万不要在迁移时顺手“优化”主题结构否则下游消费者全部需要联动修改。如果在迁移前做了这些检查客户端一层基本不用动。我见过不少迁移项目真正改动大的反而是服务端的数据消费链路和监控系统因为不同 broker 的指标暴露方式、Webhook 触发逻辑完全不一样。4.2 认证与鉴权方案迁移Mosquitto 最常见的认证方式是密码文件和简单的allow_anonymous开关配置文件里写几行就能搞定。EMQX 则提供 HTTP 认证、JWT、和数据库认证等丰富的扩展方式。迁移到国产 broker 后认证逻辑大概率需要重新对接。我们的做法是把认证逻辑收敛到一个独立的内部 HTTP 认证服务里。设备端连接时携带用户名密码或 tokenbroker 通过 Webhook 回调这个认证服务验证身份。这样无论底层 broker 怎么换认证逻辑都不变只需要在新 broker 上配置相同的回调地址。这种方法在建网初期看起来有点绕但在后续系统扩展和迁移过程中省了大量工作量。鉴权方面要注意的是 ACL访问控制语义。Mosquitto 的 ACL 是简单的“允许/拒绝”列表模型EMQX 有主题野匹配和可编程逻辑各 broker 的 ACL 配置差异很大。迁移时不要照搬配置文件而是梳理出业务侧的权限模型在新 broker 上重新实现一遍。比如我们要求设备只能向devices/{deviceId}/telemetry发布、只能订阅devices/{deviceId}/commands主题这类逻辑在每个 broker 上表达方式都略有不同建议在业务层封装成统一规则再翻译成各 broker 的配置。4.3 业务功能替换清单不同 broker 的功能差异集中体现在消息发布后的“后续处理”。Mosquitto 用户常用mosquitto_pub配合脚本做消息转发EMQX 用户依赖规则引擎发到 Kafka、MySQL 等系统切换新 broker 后这些链路的替代方案需要提前准备。我整理了一份迁移时必查的业务功能清单大家可以对着自查遗嘱消息LWT设备异常离线时broker 自动发布遗嘱这个语义在目标 broker 上是否完全一致尤其是设备用正常 DISCONNECT 包断开时遗嘱消息不应该被发布这是踩坑的高发区保留消息Retain设备上线时需要拿到最新状态保留消息的语义在新 broker 上是否支持同一主题多次发布保留消息时新消息覆盖旧消息的行为是否一致共享订阅Shared Subscription负载均衡消费场景下多个消费端共享一个订阅组目标 broker 对通配符共享订阅 $share/g1/topic 的支持是否完整有的实现在共享订阅上的负载均衡策略很简单容易造成消息倾斜离线消息堆积持久会话的离线消息存储策略新 broker 是存储在内存还是磁盘堆积到几十万条时会不会触发保护机制导致消息丢弃消息钩子/拦截器你之前是否用 broker 的钩子做过消息审计、流量统计、敏感主题拦截迁移后这些逻辑是否有对应的扩展点这些听起来都很基础但每一项在真实业务中都可能导致线上事故。我身边的案例就有一次切换后因为目标 broker 对遗嘱消息的语义理解有偏差导致几百台设备的状态在后台全部显示为“离线”运维同学排查了一个通宵。所以迁移前一定要做全链路的语义测试不能只测连通性。4.4 平滑发布与回滚策略切换 broker 的发布策略我建议遵循“灰度为先、双跑验证、随时回滚”的模式。核心思路是不要一刀切切换而是让一部分流量先走新 broker验证稳定后再放全量。具体操作可以参考这个步骤部署新 broker 集群应用全部配置保持监听同一端口在 DNS 层配置一个独立的测试域名让测试设备连接新 broker验证基本功能选择一条低风险业务线比如某些非核心哑元设备的遥测数据通过设备管理平台把这些设备的连接地址切到新 broker观察消息链路同时保留旧 broker 的日志便于问题回溯观察至少一个业务周期我们当时观察了 72 小时确认消息延迟、掉线率、消费延迟等指标都与旧系统持平或更好如果出现异常立即通过 DNS 或设备平台的配置下发切回旧 broker如果一切稳定再分批次扩大流量。这里要特别强调“回滚预案”不是一句口号而是必须是可执行的脚本和步骤。比如你提前写好了回切脚本在旧 broker 仍然在线运行的情况下随时可以把域名解析指回旧地址。我见过不少团队只部署了新的、直接停掉旧的结果新版有性能问题后连回滚的机会都没有只能紧急修复风险完全暴露。5. 常见问题与排查思路最后这部分我把实际迁移和运维过程中遇到的典型问题整理成一个速查表每条都是“症状—原因—解决思路”的结构方便大家日后排查。5.1 连接与 TLS 相关问题设备频繁掉线重连最常见的原因是 broker 连接超时时间和设备的心跳间隔不匹配。MQTT 协议里客户端通过 PINGREQ 包维持心跳broker 超过 keepalive 时间未收到任何包就会断开连接。如果新 broker 的默认超时设置比旧 broker 更短设备没有及时适配就会出现“运行几分钟掉线一次”的现象。解决方法是统一设置 keepalive 参数设备侧和 broker 侧优雅协商并检查是否存在 NAT 网关的超时机制。TLS 握手失败切换 broker 后证书链可能变了设备端如果没有更新根证书就会出现握手失败。调试时先用openssl s_client -connect命令检查证书链是否完整再用 MQTT 客户端的 debug 日志确认 TLS 错误码。不要忽略双向 TLS 场景新 broker 若要求客户端证书需要提前把设备证书签发流程跑通。连接数达到上限新 broker 默认的最大连接数可能比旧 broker 小比如 Mosquitto 默认max_connections是 -1无限制而某些国产实现默认 1024 或者受文件描述符限制。如果设备规模超过这个值需要显式调大并同步调整系统级ulimit。5.2 QoS 消息丢失、重复与顺序问题QoS 1 消息偶尔重复这是 MQTT 语义的正常现象QoS 1 是“至少一次”投递协议允许重复。如果你的业务不允许消息重复如设备指令需要在消息体里加唯一 ID消费端做去重。QoS 2 消息卡住不投递QoS 2 是“恰好一次”涉及四步握手状态。如果 broker 的 session state 保存机制有问题比如重启后状态丢失可能出现 PUBREC 之后没收到 PUBREL 导致消息卡住。排查时重点关注 session 过期时间配置建议对 QoS 2 场景做专门的断线重连测试。消息顺序颠倒MQTT 对同一主题、同一 QoS 的消息顺序有要求但乱序多数出在共享订阅场景——多个消费者并发处理时消息处理结果入库的顺序天然可能不一致。如果业务依赖严格顺序建议把某个设备的消息哈希到同一个订阅者上比如按 clientId 哈希做 sticky 消费而不是让多个消费者随机抢消息。5.3 性能压测与调优参数上线前压测不能只测“能连多少连接”要测真实业务模型下的混合负载。我的压测经验是分三步走连接压测模拟目标数量的客户端同时连接观察 broker 的内存增长和连接建立速率。这里要留意内存泄漏连接数稳定后内存如果还持续增长需要警惕消息吞吐压测固定一定数量的连接持续发布消息观察 CPU、内存、消息端到端延迟。重点看高 QPS 下延迟分布P99而不是平均值故障场景压测随机杀掉一批客户端连接观察 broker 是否会触发重连风暴、遗嘱消息风暴以及 session 重建对 CPU 的影响。调优方面需要重点关注三个参数并发事件循环线程数类似 Netty 的 boss/worker 线程模型、消息队列长度上限防止慢消费者拖垮整个 broker、系统文件描述符上限。每个参数都要结合业务模型去调整没有一套万能的配置。5.4 版权风险自查清单最后放一个版权自查清单虽然不涉及法律意见但至少能帮你在初期过滤掉明显有风险的方案核查项具体操作仓库 LICENSE 文件确认存在且是明确的 opensource license依赖树许可证扫描用工具扫描全部依赖是否有 GPL/AGPL 等强 copyleft 组件企业版功能边界核对用到的每个功能是否在开源版授权范围内修改代码的开源义务如果对源码做了修改确认许可证规定的分发义务商标使用不要在产品名称或文档中使用项目商标产生误导上游维护活跃度查看最近 release 时间、issue 响应速度和社区活跃度最后分享一点个人体会聊了这么多落在实际选型上我的经验是先把“绝不能妥协的底线”列清楚——连接规模、许可证、团队能维护的技术栈、必须支持的功能特性——再拿这些底线去过滤候选方案。至于性能数字只要压测模型接近真实业务大多数成熟 broker 都是过关的性能不是最需要纠结的要素。如果说这三年的部署实操教会了我什么那就是不要迷信任何一个“大厂开源”的光环也不要因为某个项目“社区火热”就放松对细节的验证。MQTT broker 这类基础组件最怕的不是功能少而是文档和实现不一致、升级不兼容、作者停止维护这类“隐形风险”。选一个许可证清晰、社区活跃、你团队能读得懂源码的项目远比选一个功能最花哨的项目更稳妥。如果你正在评估类似的替换方案建议先搭一个最小集群把你们最典型的业务场景完整跑一遍包括设备上线、消息上报、指令下发、离线重连这几个必经链路再决定要不要进入全面迁移。技术选型这件事永远是小规模验证先行大规模推广后置。