结论:断网续传的核心不是“缓存了就行”,而是保证数据不丢、不重、有序。做到这点需要三个机制:本地序号、云端确认、幂等入库。 一、本地序号:每条数据有唯一身份 采集端为每条记录生成设备ID加单调递增序号,同时记录采集时间戳。不能只依赖时间戳,因为工控机时钟可能漂移或被校时回拨。序号持久化到本地存储,重启后接着往下编。 二、云端确认:确认后才删除 采集端把数据批量发送,云端返回已处理到的最大连续序号。采集端只删除已确认的部分;超时未确认则重发。批量大小建议按网络状况可调,弱网时减小批次,避免整批失败。 三、幂等入库:重发不产生重复 重发必然带来重复,所以入库要以“设备ID+序号”作唯一键,已存在则忽略或覆盖。若使用消息队列,消费端同样要做去重,不能指望队列只投递一次。 四、续传时的几个坑 1. 积压数据与实时数据抢带宽:续传限速,实时数据优先; 2. 缓存空间写满:设定淘汰策略,明确是丢最旧还是丢低优先级,并产生告警; 3. 时间戳校正:入库时同时保存采集时间和接收时间,便于排查; 4. 长时间离线后的顺序:按序号而非到达顺序处理。 FAQ 问:MQTT的QoS够用吗?答:QoS1保证至少一次到达,仍需幂等去重;应用层确认仍有价值。 问:缓存放多久合适?答:按最长可能断网时长和数据产生速率估算容量,并留余量。 小结:序号定身份、确认定删除、幂等防重复,三者配合,断网续传才可靠。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。