3. 断点续传核心概念辨析
在食品SCADA系统中,数据断点续传并不是一个单一动作,而是一组相互配合的机制。现场仪表、PLC、边缘网关与中心历史库之间一旦出现网络闪断、服务器维护或采集进程重启,就会产生“数据缺口”。要正确设计续传方案,首先必须把断点、续传、重传、去重、幂等、数据完整性和一致性这几个术语的含义与边界厘清,否则很容易出现“补了数据却重复入库”“看似完整实则错位”的问题。
下面这张关系图把一次断网事件中这些概念所处的位置和相互作用梳理出来,可作为后续设计时的参照框架。
断点:续传的“起跑线”
断点指的是数据流中断时,接收端已经确认成功落库的最后一条记录所对应的位置标识。在食品SCADA中,这个标识通常有两种形式:一是采集时间戳,二是单调递增的序列号。时间戳直观,但当同一毫秒内有多条记录、或现场时钟被NTP校正时,仅靠时间戳容易产生歧义;序列号更可靠,但要求采集侧持久化维护。工程上常见的做法是“序列号为主、时间戳为辅”,断点记录为{device_id, last_seq, last_ts}三元组。
需要强调的是,断点必须是“已确认”的位置,而不是“已发送”的位置。如果网关把数据发出后未收到中心库的写入确认就宕机,此时若把发送位置当作断点,就会造成这段数据永久丢失。因此断点应保存在接收端或由接收端回执驱动更新。
续传与重传:目的不同,触发条件不同
续传是断点恢复后,从断点之后按序补送缓存数据的整体过程,它解决的是“网络恢复后把缺口填上”。重传则是续传过程中的一个子动作:当某批数据发出后在规定时间内未收到确认(例如超时5秒),发送方将同一批数据再次发送。续传是策略层面的概念,重传是传输层面的可靠性手段。二者容易混淆,但在设计中职责分明:续传决定“从哪里开始、按什么顺序补”,重传决定“单批数据没确认怎么办”。
在食品生产场景中,续传还要考虑优先级。例如杀菌釜的温度压力曲线、冷链库温湿度属于关键工艺数据,应优先补送;而一般设备运行状态可稍后补。可以按数据类别设置不同的续传队列,避免关键批次数据被大量非关键数据阻塞。
去重与幂等:重复数据的两种防线
由于重传的存在,中心库完全可能收到同一批数据两次甚至多次。去重是在写入前根据唯一键判断记录是否已存在,若存在则丢弃。食品SCADA中常用的唯一键是(device_id, seq)或(device_id, ts, tag)。去重依赖接收端维护已写入记录的索引,实现简单但有一定存储与查询开销。
幂等则更进一步:它不要求“不重复发送”,而要求“重复执行的结果与执行一次相同”。例如写入采用INSERT ... ON CONFLICT (device_id, seq) DO NOTHING,或使用带版本号的覆盖写,使得同一批数据无论到达几次,最终库中只有一份且内容一致。幂等是比去重更强的设计目标,因为它把正确性责任放在写入逻辑本身,即使去重索引失效也不会产生脏数据。实际工程中两者常配合使用:幂等写入兜底,去重索引减少无效写入。
数据完整性与一致性:两个不同的验收维度
数据完整性回答“缺口有没有补全”。判断方法是检查断点区间内的时间戳是否连续、序列号是否无跳变、记录条数是否与采集侧缓存计数吻合。例如某灌装线在14:00至14:12断网,采集侧缓存了720条记录(按1秒1条计),续传后中心库该区间应恰好有720条,且首尾时间戳对齐。
数据一致性回答“补进来的数据对不对”。完整性合格不代表一致性合格:如果续传时把A批次的温度记录错挂到B批次工单下,条数一条不少,但批次追溯已经失真。食品行业对批次追溯要求严格,因此一致性校验必须包含批次号、工单号、设备状态等业务字段的比对,而不仅是时间戳对齐。可以用抽样比对的方式:从采集侧缓存和中心库各取同一序列号的记录,逐字段核对关键工艺参数。
理解这些概念的边界后,后续设计缓存结构、确认机制和校验规则时,就能明确每个环节该由哪个概念来兜底,避免把可靠性问题全部压在某一个机制上。