聊物联网平台架构,大部分人第一反应是画一张四层图:感知层、网络层、平台层、应用层。图画得都对,但真正让项目翻车的从来不是分层,而是每一层里那些没人提前算的数。
这篇不谈概念,只谈取舍。按四个层往下拆,每一层给出具体的判断依据、容易踩的坑和成本区间,最后给一份上线前必须回答的清单。你看完应该能判断:自己手上的项目该用哪种架构、大概花多少钱、哪些地方不能省。
先看结论
- ✓决定接入层容量的不是连接数,是「每秒消息数 × 单条消息大小」,这两个数算错,后面全部白搭
- ✓1000 台设备每天就能产生 800 多万条数据,时序库选错一次,第二年的存储账单会翻三倍
- ✓边云协同的判断标准只有四条:延迟能不能忍、带宽够不够、断网能不能停、数据能不能出境
- ✓500 台设备以下的项目不要上微服务,一套单体加一个消息队列足够跑三年
一、四个基本层,以及每一层最容易踩的坑
先给一张对照表。这张表的价值不在「分层」,而在最后一列——每一层真正让项目延期的地方。
| 层级 | 职责 | 典型组件 | 最常见的坑 |
|---|---|---|---|
| 感知层 | 采集物理世界的数据,执行控制指令 | 传感器、PLC、电表、摄像头、道闸、空调面板 | 以为「支持 Modbus」等于「能对接所有 Modbus 设备」,实际上每家厂商的寄存器地址表都不一样 |
| 网络层 | 把数据从现场送到云端 | 4G/5G 模组、NB-IoT、LoRa 网关、以太网、WiFi | 按实验室网速做容量规划,现场弱网下 MQTT 心跳超时、消息堆积 |
| 平台层 | 接入、存储、计算、分发 | MQTT Broker、时序数据库、规则引擎、消息队列 | 把消息队列和数据库当同一件事,用数据库直接扛写入,几万条/秒就崩 |
| 应用层 | 面向人的界面和业务逻辑 | Web 后台、大屏、小程序、开放 API | 把业务规则全写进规则引擎的图形化配置里,半年后没人敢改 |
这张表里最值得展开的是感知层。设备协议对接的复杂度,和「协议种数」几乎无关,和「厂商数」强相关。同样是 Modbus RTU,A 厂家的温度寄存器在 40001,B 厂家在 30005,C 厂家要用功能码 03 读、04 读还不一样。做过一个校园项目,光是 7 台不同厂商的无线控制器,SNMP 的 OID 就要逐个查 MIB 文档核对,华为和锐捷的同名指标在完全不同的 OID 分支下。
设备接入的工作量,80% 花在「摸清每个厂商的实际实现」,只有 20% 花在写代码。项目排期时如果按「一种协议 3 天」估算,实际会超支 3-5 倍。
二、设备接入层:80% 的性能问题出在这里
很多人问「一个 MQTT Broker 能扛多少设备」,这个问题没法直接回答,因为真正的容量公式是:
压力 = 在线连接数 × 每设备每秒消息数 × 单条消息字节数。连接数只影响内存,消息速率才影响 CPU 和网络。10 万台设备每 5 分钟报一次,压力远小于 5000 台设备每秒报一次。
按这个公式,可以把接入层分成三档。三档之间的差别不只是「加机器」,而是组件形态要变。
| 设备规模 | 每秒消息量(估) | Broker 部署 | 是否需要消息队列 | 数据库写入策略 |
|---|---|---|---|---|
| 1 万以内 | 100-500 条/秒 | 单节点 EMQX / Mosquitto 即可 | 不需要 | 直写时序库,批量提交(每 500 条或 1 秒) |
| 1 万 - 10 万 | 500-5000 条/秒 | EMQX 集群 3 节点 + 负载均衡 | 建议加 Kafka,做削峰和异步消费 | Kafka 消费后批量写入,写入并发控制在库的最佳区间 |
| 10 万以上 | 5000 条/秒以上 | EMQX 集群 + 独立接入网关层 | 必须 Kafka,且要分区规划 | 分库分表或按设备 ID 哈希分片,配合冷热分离 |
除了容量,接入层还有三个必须提前定死的参数,定错了后期改起来很痛:
- 心跳间隔(keepalive):默认 60 秒。设太短,10 万台设备的空心跳就能打满 Broker;设太长,设备掉线要 3 倍时间才能发现。建议 60-120 秒,配合服务端主动探测。
- 重连退避:设备断网恢复后如果同时重连,会造成「惊群」。必须让设备端做指数退避加随机抖动,否则一次基站切换就能把 Broker 打挂。
- QoS 等级:QoS 2 的开销是 QoS 0 的 4 倍以上。除了计费类指令,其余全部用 QoS 0 或 1。见过一个项目全链路 QoS 2,10 万台设备的吞吐只有理论值的四分之一。
还有一个常被忽略的点:设备离线判定和业务告警要分开。设备离线是通信层事件,业务告警是应用层事件。把两者混在一起,会导致「网络抖一下,值班手机响一片」。正确做法是设备离线超过 3 个心跳周期才置为离线,超过 10 分钟才发业务告警。
三、数据层:时序库选型,和一张容易被低估的账单
先算一笔账。假设 1000 台设备,每台 10 个指标,10 秒上报一次:
1000 × 10 × 8640 次/天 = 8640 万条/天,约 2500 万条/天压缩后仍占 3-8 GB。一年下来 1-3 TB。如果选了一个不支持高压缩比的方案,或者把原始数据全量保留三年,第二年的存储和查询成本会翻三倍以上。
时序库的选择,本质是在「写入吞吐、压缩比、查询灵活度、运维成本」之间做取舍。下面是常见四种的实际对比:
| 方案 | 写入能力 | 压缩比 | 查询语言 | 运维复杂度 | 适合场景 |
|---|---|---|---|---|---|
| TDengine | 很高,单机可到百万级/秒 | 高(列式 + 专用压缩) | 类 SQL,支持降采样函数 | 低,国产文档齐全 | 设备量大、指标结构固定、团队没专职 DBA |
| InfluxDB | 高 | 中高 | Flux / InfluxQL | 中,集群版为商业授权 | 指标基数高、查询灵活度要求高 |
| TimescaleDB | 中高 | 中 | 标准 PostgreSQL SQL | 低(就是 PG) | 已有 PG 技术栈、需要和业务库联表 |
| ClickHouse | 极高 | 高 | SQL,分析能力强 | 中高,需要懂分区和索引设计 | 既要时序又要多维分析、报表场景重 |
比选型更重要的是分层保留策略。不管用哪个库,都建议按这个结构设计:
- 原始数据(10 秒/1 分钟粒度):保留 7-30 天,用于问题回溯和精确告警
- 分钟聚合(平均值、最大值、最小值、累计值):保留 1 年,用于趋势分析
- 小时聚合:保留 3 年,用于同比环比和年度报表
- 日聚合:永久保留,数据量小,用于长期经营分析
这套结构能把存储成本压到全量保留的十分之一左右,同时不影响任何常见查询。代价是聚合任务要写对,尤其是「累计值」的聚合不能简单求和,要取每个时间段的最大值减最小值。这个细节做错,电表读数、流量统计会全线出错。
四、边云协同:什么该放边缘,什么必须上云
「边缘计算」这个词被用得过度了,很多项目把边缘当成一个技术时髦,结果部署了一堆边缘盒子,运维成本翻倍,收益却说不清。判断标准其实只有四条,按顺序问:
| 判断维度 | 问自己 | 如果答案是「是」 | 如果答案是「否」 |
|---|---|---|---|
| 延迟 | 从采集到动作,能不能容忍 200 毫秒以上的往返? | 必须放边缘 | 可以考虑上云 |
| 带宽 | 现场上行带宽是否小于 1 Mbps,或按流量计费? | 边缘做预处理和聚合 | 原始数据可直传 |
| 断网可用 | 断网时业务能不能停? | 边缘必须能独立闭环 | 纯云端可接受 |
| 数据合规 | 原始数据是否不允许离开现场? | 边缘存储,只上传统计结果 | 可以上云 |
举个最典型的例子:停车场道闸。断网时车还得出去,所以「识别车牌 → 比对白名单 → 抬杆」这一整条链路必须在本地完成,云端只负责同步白名单、记录流水、做跨场站的对账。这类业务如果设计成「识别后请求云端判断」,一次网络抖动就会堵住出口。
反过来,边缘不适合做的事情也很明确:
- 跨站点对比分析——边缘只有本站数据,做不了横向比较
- 长期趋势和同比环比——边缘存储有限,保留不了几年数据
- 复杂规则和模型推理——边缘算力有限,模型更新也麻烦
- 统一权限和审计——分散在各站点无法统一管控
如果拿不准,就按「边缘保底、云端增强」设计:边缘保留最近 7 天的本地数据和最关键的 5-10 条联动规则,保证断网时核心业务不中断;其余全部上云。这样边缘的开发和运维成本可控,又不会因为断网背锅。
五、应用层:规则引擎的边界到底在哪
规则引擎是 IoT 平台最好卖的功能,也是最容易变成技术债的功能。判断一条逻辑该不该放进规则引擎,只需问一句:这条规则未来半年会不会变?变的时候是谁来改?
| 逻辑类型 | 放规则引擎 | 写进代码 | 理由 |
|---|---|---|---|
| 阈值告警(温度 > 40 报警) | ✓ | 变化频繁,运营自己就能调 | |
| 简单联动(门磁开 → 灯亮) | ✓ | 场景多、组合多,代码写不完 | |
| 定时任务(每晚 22 点关空调) | ✓ | 纯配置,无需开发介入 | |
| 跨设备多条件关联(A 设备报警且 B 设备在线才触发) | △ | ✓ | 规则引擎表达力有限,复杂条件会写成天书 |
| 需要历史数据回算(同比上周同期) | ✓ | 规则引擎通常只处理流数据 | |
| 需要调用外部 API 或走审批流 | ✓ | 涉及事务和错误处理,配置化做不了 |
一个实际的经验:规则引擎里的规则数量超过 200 条之后,维护成本会指数上升。因为规则之间会互相影响,改一条不知道会触发什么。这时候应该做的是「规则分组 + 生效范围 + 变更审批」,而不是继续往里堆。
另外,应用层一定要预留开放 API。理由很实际:客户早晚会提「能不能和我们自己的 OA/ERP 对接」。如果平台没有标准 API,每次对接都要定制开发,一个项目能拖三个月。API 设计上优先保证三件事:鉴权清晰、分页规范、错误码可读。
六、三种典型架构的适用场景与成本区间
把上面的内容收拢,实际项目里 90% 落在三种架构之一。这张表可以直接用来做方案对比和报价参考。
| 架构形态 | 设备规模 | 硬件投入 | 软件投入 | 运维人力 | 首年总成本区间 |
|---|---|---|---|---|---|
| 单机版(一体化部署) | 500 台以内 | 1 台 8 核 16G 云服务器 | 开源组件 + 少量定制 | 0.5 人 | 3-8 万 |
| 标准云版(集群化) | 500 - 5 万台 | 3-5 台云服务器 + 对象存储 | 商业平台授权或自研 | 1-2 人 | 15-60 万 |
| 边云混合(多站点) | 5 万台以上 / 多现场 | 每站点边缘盒子 2000-8000 元 + 云端集群 | 平台 + 边缘系统 + 集成 | 2-4 人 | 60 万起,随站点数线性增长 |
三个提醒:
- 1500 台设备以下不要上微服务。拆分带来的部署复杂度、链路追踪成本,远大于它带来的弹性收益。一套单体应用加一个消息队列,足够跑到 5000 台。
- 2边缘盒子的成本不要只看硬件。每个站点的上门部署、调试、后续固件升级,人工成本通常是硬件价格的 2-3 倍。
- 3云服务器的钱可以省,数据库的钱不要省。见过太多项目在 4 核 8G 的机器上跑时序库,然后抱怨查询慢。
七、上线前必须回答的 12 个架构评审问题
这份清单可以直接拿去开评审会。任何一条答不上来,都说明这块设计还没想清楚。
- 1峰值每秒消息量是多少?这个数是怎么算出来的,有没有实测依据?
- 2单台设备离线多久算异常?离线判定和业务告警是不是分开的?
- 3设备批量重连时,Broker 会不会被打挂?退避策略是什么?
- 4原始数据保留多久?聚合数据保留多久?一年后的存储成本是多少?
- 5时序库的单表(或单分区)能撑多久?什么时候需要分片?
- 6断网时哪些功能必须可用?边缘侧有没有独立闭环能力?
- 7规则引擎里现在有多少条规则?谁负责维护?变更流程是什么?
- 8对外 API 的鉴权方式是什么?第三方对接需要多久?
- 9设备固件升级(OTA)失败了怎么回滚?升级期间业务会不会中断?
- 10有没有做过一次真实的断网演练和一次真实的压力测试?
- 11监控告警覆盖到哪一层?Broker、数据库、业务接口分别由谁盯?
- 12这套架构如果设备量翻 10 倍,需要改哪些部分?改造成本大概多少?
第 12 条是架构设计的分水岭。如果答案是「要重做」,说明架构没有留出扩展余地;如果答案是「加机器就行」,说明分层做对了。好的架构不是一次设计到 100 万台,而是让从 1 万到 10 万的迁移成本可控。
八、常见问题
自建物联网平台还是买现成的?
看两件事:设备协议复杂度,和业务差异化程度。协议种类多、厂商杂(比如要对接几十家不同品牌的电表、空调、传感器),自建的对接成本很高,建议买现成平台再二次开发。业务逻辑是核心竞争力(比如停车场的计费规则、充电桩的分时电价),这部分必须自己写,但底层的接入和存储可以买。
MQTT 一定要用吗?能不能直接用 HTTP?
设备端能稳定保持长连接、需要服务端主动下发指令,就用 MQTT。设备只能短连接、上报频率很低(比如一天几次)、或者设备是电池供电且要极致省电,HTTP 或 CoAP 更合适。很多项目是混合的:主链路 MQTT,配置下发和文件传输走 HTTP。
边缘计算节点用什么硬件?
看算力需求。只做协议转换和数据聚合,ARM 架构的工控机(4 核 2G)就够,成本几百到一千多。要做视频分析和本地 AI 推理,才需要上带 GPU 或 NPU 的设备,成本会到几千。不要为了「以后可能要跑 AI」提前上高配,边缘设备的迭代周期比云端快得多。
架构设计阶段需要做压力测试吗?
必须做,而且要用真实设备或真实报文做。用脚本模拟的 MQTT 客户端,行为和真实设备差别很大——真实设备会有重连风暴、会有报文格式错误、会有半开连接。建议在架构定稿后、开发开始前,用 100 台真实设备跑一次 72 小时稳定性测试,能提前暴露大部分接入层问题。
常见问题
选型和技术评审时最常被问到的几个问题,直接给结论。