上篇文章《用Netty还是MQTT》发出去之后,评论区吵起来了。
有个兄弟说“瞎扯淡”。然后“林间隐居宁静致远”本人来了,说那段评论确实是他写的——他用Netty做了7年校园洗衣机项目,几十万台设备,稳定运行;后来做工业园区用MQTT,每个网关连100个设备,也跑了一年半。
两段真实的项目经历,两种完全不同的技术选型。到底谁对?
我说点更具体的。
先还原一下两个项目的真实场景。
项目A:校园智慧洗衣机(Netty方案)
设备数量:一个学校3000到10000台,200个学校,总共几十万台
通讯方式:设备通过4G/WiFi连到服务器,走自定义TCP协议
核心需求:实时控制(用户扫码支付后要立刻启动洗衣机)
技术选型:Netty + 自定义协议
运行时间:7年
运行状态:稳定
项目B:工业园区智慧管理(MQTT方案)
设备数量:每个网关连接100个设备左右
通讯方式:网关通过MQTT连接到平台
核心需求:数据采集、状态监控、远程管理
技术选型:MQTT(标准协议)
运行时间:1.5年
运行状态:稳定
两个项目都跑通了。但为什么选型完全不同?
第一个关键差异:设备端固件是否可控。
项目A的洗衣机,是这位兄弟自己公司做的——固件程序是自己写的。这意味着他可以自己定义通讯协议、自己控制设备端的行为。设备什么时候发数据、发什么数据、怎么保持连接,全部可以按自己的设计来。
这种情况下,Netty的自定义TCP协议是最优解。没有协议开销、没有标准化约束,通讯效率可以做到最高。
项目B的工业园区,设备来自不同厂家——温控设备、PLC、照明控制器、边缘网关。你不可能让每个厂家都按照你的自定义协议来改固件。这时候只能用标准协议——MQTT是设备端最容易支持的。
第二个关键差异:实时性的要求等级。
项目A要求“用户扫码支付后立即启动”。这个“立即”是多少毫秒?虽然没有明确数字,但用户体验的要求是——扫码之后不能等。
自定义TCP协议走的是直连,客户端和服务器之间没有中间节点。延迟取决于网络质量,局域网内可以做到几毫秒,4G网络下几十毫秒。
项目B的要求是“数据采集、状态监控、远程管理”——这些都是非实时性的。温度数据晚几秒上传没关系,设备状态晚几秒刷新也没关系。
MQTT的延迟是多少?前面提到的论文数据是133ms(云部署场景)。133ms对数据采集完全够用,但如果是“扫码后立即启动洗衣机”,133ms用户能感觉到卡顿吗?可能感觉不到,但如果是“按下急停按钮后立即停机”,133ms就是致命的。
第三个关键差异:连接数量的量级。
项目A是几十万台设备同时在线。如果用MQTT,需要部署一个能承载几十万连接的MQTT Broker。市面上能承载这个量级的Broker不多,而且成本不低。
如果用Netty,一台配置好一点的服务器,用NIO多路复用模型,管理几十万TCP连接是完全可行的。
项目B是每个网关连100个设备。MQTT Broker需要承载的是网关数量,不是设备数量。假设有100个网关,每个网关连100个设备,MQTT Broker只需要承载100个网关连接。这个量级对任何MQTT Broker来说都是小菜一碟。
连接数量级差了一万倍,选型自然不同。
第四个关键差异:协议标准化的价值。
项目B的工业园区,设备来自多个厂家。用MQTT的好处是——任何支持MQTT的设备都能接入,不需要为每个厂家单独开发驱动。
项目A的洗衣机,设备是自己公司做的,固件是自己写的。标准化没有价值,自定义协议反而更高效。
那到底该怎么选?我把决策逻辑画成一张表。
判断维度 选Netty(自定义TCP) 选MQTT 设备固件是否可控 可控(自己开发/可定制) 不可控(多品牌/第三方) 实时性要求 高(毫秒级控制) 低(秒级监控) 连接数量级 十万级以上 万级以下 是否需要标准化接入 不需要 需要 开发资源 有较强的网络编程能力 愿意用现成的Broker和客户端 “瞎扯淡”这条评论,我正面回应一下。
那位兄弟说“瞎扯淡”。我不知道他具体指的是哪部分。但如果他指的是“Netty不适合MQTT的场景”或者“MQTT不适合Netty的场景”——那我同意。没有哪个协议是万 能的。
我的核心观点是:技术选型要看场景,不是看哪个更“先进”。
用Netty做几十万台洗衣机的实时控制,正确。用MQTT做工业园区的数据采集,正确。用Netty做工业园区的多品牌设备接入,也能做,但开发成本高得多。用MQTT做洗衣机的实时控制,也能做,但延迟和确定性要打折扣。
两个项目都跑了几年没出问题,说明选型都是对的。不是“谁对谁错”,是“场景不同”。
最后说一个我从这两个项目里学到的道理。
做技术选型的时候,最容易犯的错误是“用一个项目的经验去套另一个项目”。
“我用Netty做过几十万台设备,所以所有项目都该用Netty。” “我用MQTT做过工业园区,所以所有项目都该用MQTT。”
每个项目都有它的特殊性——设备固件能不能控、实时性要求多少、设备数量多少、团队技术栈是什么。把这些搞清楚,选型自然就清楚了。
不要迷信任何一种技术,也不要贬低任何一种技术。
平时我也写写代码,维护两个开源项目:
ProtoForge(工业协议仿真平台,17种协议,90+设备模板): GitHub:suoten/ProtoForge Gitee:suoten/ProtoForge
EdgeLiteGateway(AI物联网关,13种协议采集,边缘AI推理): GitHub:suoten/EdgeLiteGateway Gitee:suoten/EdgeLiteGateway
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050062/viewspace-3185162/ ,如需转载,请注明出处,否则将追究法律责任。