百万设备规模的云账单,钱到底花在哪了
一个物联网平台从十万设备跑到百万设备,最先让你睡不着觉的往往不是设备逻辑,而是每个月准时到来的云账单。设备量上去之后,费用增长并不是线性的,经常会出现上个月成本还在十几万,这个月突然到了三十几万的情况。这种增长不完全是业务量增加的结果,很大一部分是因为架构在规模扩大后开始产生低效开销。

这篇文章想聊的就是一个问题:当你的平台已经或者即将服务百万级设备时,云费用到底应该怎么降。先说结论:物联网平台的成本问题,本质不是“用哪个云更便宜”,而是连接层、消息层和存储层各自有没有做对规模化的设计。下面我会把每一层拆开来看。
在拆解之前,先建立一张成本地图。物联网平台的云费用通常由四块构成:连接入网、消息流转、数据存储、计算处理。每一块的计费逻辑和优化空间完全不同,见下表。
| 成本层 | 主要费用来源 | 规模敏感点 | 典型优化方向 |
|---|---|---|---|
| 连接层 | MQTT/TCP长连接、TLS握手、网关实例 | 连接数、心跳频率、泛连接请求 | 连接聚合、动态心跳调整 |
| 消息层 | 消息队列API调用、Topic数量、消息体大小 | 消息条数、副本数、Topic分发倍数 | 批量上报、精简Topic、生命周期管理 |
| 存储层 | 时序库、对象存储、日志存储 | 数据保留周期、副本数、存储类型 | 冷热分层、降采样、TTL过期 |
| 计算层 | 流处理作业、规则引擎、函数计算 | 事件触发次数、计算粒度、资源闲置 | 按需触发、批处理替代实时 |
这张表里最值得留意的是每一层的“规模敏感点”,因为物联网平台的成本失控通常不是某个服务单价贵,而是敏感点被放大。举个简单的计算例子,如果百万台设备每天每台上报10条消息,一天就是一千万条消息,一个月就是三亿条。如果消息链路里有一个环节按条数计费,这个量级会直接变成账单上的数字。更麻烦的是,设备上报往往集中在某些时段,比如夜间批量同步,瞬时吞吐会进一步推高峰值计费。
三个让费用失控的默认做法
物联网平台成本暴涨,很少是因为某个云服务标价高,更多是因为团队带着互联网后端习惯做了很多“默认设计”。这里说三个我比较常看到的问题。
误区一:所有设备数据都实时写入数据库
设备上报的每一条数据都直接入库,看起来天经地义。但百万设备里,绝大多数数据的价值密度很低。比如一个智能水表,每15分钟上报一次读数,其中99%的数据都是正常量,只有极少数值异常需要触发告警。把所有原始数据实时写入时序库,意味着存储和写入吞吐都被低价值数据撑满,而真正需要关注的数据反而没有得到更好处理。
一个典型的场景是智能楼宇项目,设备数量不算夸张,但每个设备都有温度、湿度、电表等多路传感器,实时入库后,数据库的存储量每天以几十GB增长。后来改了数据采集策略,只在数值波动超过阈值时上送原始值,平时只上送5分钟均值,数据库负载直接降了一半多。
误区二:消息全进Kafka,所有下游都直接消费原始流
Kafka是最常见的中转组件,但在物联网场景里,很多团队把Kafka当成了“万能管道”,不管什么数据都往里塞,而且保留多份副本,Topic也按设备类型拆得很碎。设备消息本来就有峰值特征,夜间批量上报时,Kafka的分区数量和副本数会直接放大存储和网络成本。
一个典型车联网平台,为支持多条业务线,把每一条车辆轨迹点同时发到六个Topic里,还要为每个Topic留三天的数据。十万设备时问题不明显,规模一到五十万,消息队列的费用就超过了计算费用。这其实就是消息分发倍数带来的乘法效应。
误区三:把可用性标准平均化
用三个副本存储实时状态数据,却还用同样的策略保存设备历史日志;用高吞吐计算引擎处理每分钟一次的聚合任务,却让它24小时空转等待。成本就是这么被平均掉的。物联网平台里的数据有不同的生命周期和访问模式,按统一标准设计,一定会为不需要高可靠的数据付出额外成本。
降费用的三个杠杆:连接、消息、存储
连接层:先处理无效连接开销
连接层的成本很容易被忽略,因为它通常不出现在单张大账单里,而是隐藏在网关实例和公网流量中。设备在线状态的维护是最大的隐性开销。每台设备每隔几十秒发一次心跳,百万设备意味着每秒上万次心跳消息,这些消息没有业务价值,但占用了网关和消息队列的处理能力。一个实用的做法是动态心跳间隔:设备在空闲时主动延长心跳周期,比如从30秒调整到5分钟,平台端只保存最后一次在线时间。这样连接网关的压力会明显下降。
另外,如果设备端支持,可以让多个设备通过本地网关汇聚后再连接平台,平台侧不需要面对大量单点连接。这个方案在工业网关、小区集中器等场景很常见,一次性可以把连接数降低一个数量级。
消息层:把消息条数降下来
消息层的优化核心是把消息条数降下来。不是所有消息都要独立发送。很多设备上报的数据具备批次性,例如采集器每秒钟产生多条数据,完全可以在设备端做批量打包,平台端再解包处理。这样既能减少消息条数,也能降低消息头带来的额外开销。
# 伪代码:设备端消息批量上报
def report_data(sensor_reading):
buffer.append(sensor_reading)
if len(buffer) >= 50 or time_since_flush > 60:
payload = compress(json.dumps({'dev': device_id, 'data': buffer}))
mqtt_client.publish('dev/{id}/batch', payload, qos=0)
buffer.clear()
这段逻辑会把50次小消息合并成一次大消息,单条payload虽然变大了,但消息条数降为原来的1/50。在按条数计费的平台上,费用下降会非常明显。更彻底的做法是放弃QoS 1,改投QoS 0,因为很多监控数据丢一两条并不会影响统计结果,却可以省掉ACK流量和与主题关联的持久化开销。
当然,不是所有消息都适合批量,比如设备告警消息需要实时上行,这类消息就应该保留独立上报路径。所以更准确的说法是,把消息分成实时信令和批量数据两类,分别走不同链路。
存储层:热数据与冷档案分开
存储层的优化空间最大,因为设备数据天生有时间维度。实时上报的数据往往只需要保留几天供在线查询和规则引擎使用,历史数据则可以降采样后转入对象存储。我一般推荐三级存储策略:
- 热数据:最近3天,存时序数据库,用于在线查询和实时告警。
- 温数据:最近90天,每分钟数据降采样为5分钟均值,存成本型存储或单副本时序库。
- 冷数据:超过90天的原始数据压缩后进入对象存储,只在故障回溯时临时还原。
这套策略的关键在于降采样。以一个每天产生10亿条数据点的平台为例,如果把数据粒度从1分钟变成5分钟,数据量会直接减少到原来的1/5,而大多数业务看到的数据趋势几乎没有变化。真正需要原始数据的,只有设备故障分析和精细化运营,到时候再临时去冷存储取即可。
消息链路和存储选型:选对才能省
消息链路:不必非得是Kafka
不少平台的核心链路是:设备-接入网关-MQTT Broker-消息队列-流处理-数据库。消息队列选型直接决定成本和运维复杂度。很多团队在日均消息量还不到几千万条的时候,就自建了三节点Kafka,实际上大部分流量并不需要走消息队列,直接在Broker层用规则引擎转发到终端服务就够了。
| 方案 | 优势 | 成本风险 | 适合场景 |
|---|---|---|---|
| 自建 Kafka | 吞吐高,生态成熟 | 机器与存储成本高,Topic碎时Broker压力大 | 大规模实时计算,多团队共用管道 |
| Apache Pulsar | 存算分离,多租户友好 | 部署运维复杂,中小规模资源占用偏高 | 需要跨团队隔离,统一消息基础设施 |
| 云上 MQTT 网关+轻量消息路由 | 免运维,按量计费,无副本闲置 | 高级特性受限,单条消息成本可能偏高 | 中小规模,弹性明显的业务 |
这里想提醒的是,Kafka的成本优势建立在规模效应上。如果业务只有几个消费者,消费逻辑也简单,完全可以用云上的消息服务替代,否则你不仅要承担三台以上实例的费用,还要持续付出运维精力。
时序存储:也要算成本账
时序数据库选择同样需要算账。InfluxDB写入和查询性能都很好,但单节点存储成本偏高,分布式版本授权费不低。对于百万设备每天几十GB的数据,云厂商提供的时序数据库或者基于对象存储加查询引擎的方案,往往更划算。具体选择还是要看团队运维能力和查询模式,不能只看功能特性的多少。
从哪些地方动手开始降费用
如果平台已经在运行,但还没有做过系统成本治理,我建议按下面的顺序推进。每一步都能带来立竿见影的账单变化,而且尽量不改变整体架构:
- 先做成本归因:拉出云账单,按连接、消息、存储、计算四类拆分,找出占比最高的两块。
- 调整设备上报策略:与业务方确认数据精度要求,把高频上报改成可容忍的频率,合并小消息,压缩payload。
- 在边缘节点做数据过滤:剔除周期性重复数据,只上送变化量和异常事件。
- 建立数据分级存储:从改变保留周期开始,例如把时序库保留时间从一个月改成7天,同时启动降采样任务。
- 评估消息队列的必要性:检查每个Topic的实际消费方,删除无人消费Topic,降低副本数。
成本优化不是架构师一个人能完成的,设备端上报策略的改动会影响业务侧的数据分析逻辑,所以提前和业务方约定不同数据的时效性和精度要求,可以减少很多返工。
一个容易被忽视的细节是,云厂商的存储费用中很大一部分是请求次数而非容量。如果设备数据小文件很多,写入对象存储会导致请求费超过存储费。合理的办法是先合并成一定大小的文件,再批量转储。
成本优化是一场持续工程
回到开头的问题,百万设备的云费用降下来,靠的不是某一次改造,而是在连接、消息、存储、计算每个环节里,把不该花的开销识别出来。最优方案不一定是最新架构,而是适合团队现阶段运维能力和资金投入的架构。
物联网平台有一个特点:设备一旦接入,变更成本就会变高。所以成本优化要趁早做,尤其是存储策略和消息生命周期这两块,越早设计,后期越省力。如果设备量还没有到百万,也可以先按这里的思路做成本核算和资源规划,避免后面被动地为了降费用而重构。
原创文章,作者:fudengji,如若转载,请注明出处:https://fudengji.cn/article/892/