工业现场的边缘网关,往往同时接下位机采样和上平台上报。链路正常时,数据“采到就发”似乎没有问题;一旦 4G/有线链路抖动、机房维护或平台升级导致断连,两类后果会接连出现:断网窗口内的测点丢失;网络恢复后,积压报文在短时间内打满接入带宽、消息队列或入库能力,把本来已经恢复的平台再次拖垮。
本文讨论的对象是边缘网关侧的本地缓存与断点续传(补传)设计,目标是同时守住“不断点”和“重连不冲垮平台”。它不同于上位机本地库与服务端之间的离线同步架构,也不同于设备异常重启后的状态恢复;那些问题可分别参见《工业设备数据系统如何设计本地存储、服务端与离线同步架构?》与《物联网设备断网或意外重启后,如何恢复运行并避免状态错误?》。设备接入阶段要把离线与补传写进机制清单,可对照《IoT设备接入平台前需要设计哪些内容?设备身份、协议、心跳、离线与控制》。
常见现象可以分成两组。
第一组是静默丢点:曲线上出现空白段;报表缺班次;告警规则因缺少采样而误判“恢复”或“未触发”。运维往往先怀疑传感器或协议,直到对照网关本地日志才发现:断连期间采集仍在进行,只是发送失败后被直接丢弃,或环形缓冲被新数据覆盖却没有落盘。
第二组是重连冲击:链路一通,网关把几小时甚至几天的积压按最快速度重放;平台侧出现连接数飙升、主题积压、写库延迟、消费超时;实时监控反而被历史补传挤占。更糟的是,补传与实时流共用同一条通道且没有优先级,现场人员看到的“当前值”短暂回到几小时前的旧点,再被新点覆盖,形成难以解释的跳变。
这两类问题经常被当成“网络质量差”或“平台要扩容”。若不先分清是缓存策略、续传节奏还是平台接入限流缺失,扩容往往只是把冲击延后到下一次更长的断网。
从链路上看,问题通常叠在几层决策上。
采集与发送解耦不足。 若采集回调里同步执行网络发送,发送阻塞或失败就会拖慢采集节拍,甚至在协议栈卡住时丢掉整包采样。边缘网关应把“写入本地可靠队列”与“按策略上送”拆开:采集成功的判据是入队(或落盘)成功,而不是平台 ACK。
缓存只有内存、没有耐久与水位。 纯内存环形缓冲在进程重启、看门狗复位或掉电后清空;没有高/低水位时,要么无限增长吃光 RAM,要么默默覆盖最旧数据却不产生可观测事件。介质选择(SPI NOR/NAND、eMMC、工业 SD、带电容的掉电保护)要与允许的最长断网时长、单条记录大小和掉电风险匹配,而不是先按“方便调试的日志目录”实现。
续传缺少顺序、去重与节流。 仅“重连后把积压文件尽快发完”会忽略:平台可能已收到部分批次;同一条记录因超时重试被写两次;历史补传抢占实时通道;多网关同时从同一维护窗口恢复,形成对齐的流量尖峰。幂等键(设备 ID + 采集时间 + 序列号,或业务侧唯一 message id)、批次大小、发送间隔,以及平台侧的接入配额,需要作为同一套契约设计,而不是网关单方面“尽力发完”。
数据优先级未分层。 告警事件、开关量变位、设定值变更与高频遥测的价值不同。断网时若一视同仁,有限缓存会先被高频点填满,真正影响安全与闭环的事件反而被挤掉;重连时若一视同仁,补传洪峰会淹没实时告警通道。
下面按工程上可落地的顺序给出要点。具体协议可以是 MQTT、HTTP/HTTPS 批量上报或其他私有帧,原则相通。
在写缓存代码前,用一张表把测点/事件分成至少三档,并写进项目约束,而不是事后口头约定:
| 数据类 | 典型内容 | 断网时期望 | 缓存满时倾向 |
|---|---|---|---|
| 关键事件 | 告警产生/恢复、联锁动作、远程指令执行结果 | 尽量可靠送达,可接受延迟 | 优先保留;可驱逐普通遥测 |
| 过程遥测 | 周期温度、压力、电量等 | 按业务允许的最长缺口缓存 | 可按采样降频或丢最旧 |
| 诊断与调试 | 详细日志、原始波形片段 | 能传更好,不能传可截断 | 最先丢弃或仅采样上传 |
没有这张表,“本地能存多少”无法计算,续传优先级也无法实现。状态监测场景里,原始波形、特征量与事件的留存策略还可与整条数据链路一并规划,参见《状态监测系统的数据链路怎么设计?从采集、边缘处理到云端存储》。
实用结构通常是:持久化队列 + 游标(或 ACK 偏移)。
介质上,小容量 NOR + 磨损均衡适合元数据与游标;大体量遥测更常见 eMMC/工业 SD。无论哪种,都要规定:文件系统满、只读挂载、坏块时的行为(停采、降频、切只保留关键事件,或进入安全态),并产生本地可检索的故障码。
容量估算用显式假设,例如:
所需字节 ≈ 单条序列化长度 × 采样频率 × 允许断网时长 × 冗余系数
冗余系数覆盖索引、对齐、磨损预留和未完成批次。算出的是下限;真正选型还要加诊断分区和固件升级占用。若算出来远超板级可承受的存储,应回头砍数据类或降低普通遥测频率,而不是幻想“压缩一下就够”——压缩比例依赖数据形态,不能当作未验证的保证。
至少设置:
溢出时“丢最旧”还是“拒最新”没有普适答案:过程曲线常丢最旧以保住最近窗口;若业务要的是完整批次(例如一次试验过程),拒最新并告警可能更合适。关键是策略写进配置与文档,并在监控里暴露,避免现场只能看到“曲线缺了一截”却不知道是网关主动丢弃。
续传不要等同于“把文件直接倒进网络”。更稳妥的契约包括:
幂等是平台与网关的共同责任。网关侧保证稳定的 message id;平台侧以唯一约束或去重窗口吸收重试。只做一端,断网抖动下仍会出现双写或误丢。
断网期间若设备时钟漂移,补传曲线会整体错位;网关应明确:以谁的时钟为准、NTP/GPS 不可用时如何标记时间质量。远程控制指令更不应混进无序遥测补传队列:指令需要独立的超时、互斥与“断连期间是否仍执行本地策略”的规则。接入阶段的心跳、在线状态与控制语义,仍应回到设备接入设计中统一,而不是在缓存模块里临时打补丁。
这套设计有明确边界。
代价方面:物料与结构(存储与掉电保护)、固件开发与测试周期、平台去重与限流改造,都应在立项时计入,而不是上线后用扩容填坑。
验证应覆盖网关与平台两侧,建议至少包括:
验收指标应事前写明,例如:允许的最大数据缺口、关键事件丢失数为零、补传追平时间上限、重连后平台关键延迟阈值、重复记录比率上限。没有指标的“补传功能演示通过”,不能代表可上线。
边缘网关的本地缓存与断点续传,要同时回答两个问题:断网时数据放哪里、以什么优先级保全;重连时以什么节奏、什么顺序、什么幂等约定还给平台。把采集与发送解耦、把队列做成可恢复结构、把水位与溢出变成可观测行为,并与平台限流、去重和展示语义对齐,才能避免“丢点”和“冲垮”在同一次故障里轮流出现。
北京心玥科技有限公司可在物联网与嵌入式项目中,参与边缘网关采集上报、本地缓存与补传策略,以及配套平台接入侧的方案设计与实现。具体范围、指标、周期与费用需按项目约束评估后确定。