使用CRC-32C做传输文件校验时如何交付各文件对应的校验值
多机器文件同步校验值交付与校验流程行业规范
校验值交付通用方案
业内主流有三种校验值交付方式,可根据你的架构复杂度选择:
- 同目录侧载校验文件:这是轻量场景最常用的方案,不需要依赖外部数据库。为每个原文件生成同名后缀的校验文件,例如原文件为
user_data.csv,对应校验文件为user_data.csv.crc32c,文件内仅存储对应原文件的CRC-32C校验值。同步时先传输原文件,原文件传输完成后再传输校验文件,业务应用仅在检测到对应校验文件存在时,才会读取原文件,读取前先计算本地原文件的CRC值与校验文件内容比对,一致才会处理。 - 传输协议包头内嵌校验值:如果你是自研文件传输链路,直接将提前计算好的CRC-32C值放到传输请求的元数据包头中,接收端收完全量文件数据后,先和包头内的校验值比对,比对通过才将文件落地到正式业务可读目录,否则直接丢弃触发重传。
- 分布式元数据存储校验值:只有大规模集群同步场景才会使用数据库存校验值的方案,你之前觉得不合理大概率是流程顺序错误,正确流程不会有冗余操作:发送端先把文件全量传到接收端的隔离临时目录,再把提前计算好的CRC值写入数据库,同时标记文件传输完成状态;接收端收到状态通知后,计算临时目录内文件的CRC值与数据库存储值比对,比对通过才将文件移动到正式可读目录,比对失败直接触发重传。
标准文件同步校验执行流程
所有成熟的文件同步方案都会遵循原子性原则,从根源上避免半文件被读取的问题,核心流程如下:
- 发送端提前计算待同步文件的CRC-32C校验值
- 发送端将文件传输到接收端的隔离临时目录(业务不会扫描该目录,临时文件统一加
.tmp后缀) - 全量文件传输完成后,接收端计算本地临时文件的CRC值,与提前生成的校验值比对
- 比对通过后,执行同分区原子移动操作,将临时文件移动到正式业务可读目录,同步更新校验元数据(侧载校验文件/数据库元数据都在这一步完成)
- 比对不通过则直接删除临时文件,触发重传逻辑
如果你不需要自研同步工具,直接用rsync即可满足需求,它默认内置校验逻辑,也可指定使用CRC-32C算法,传输完成自动校验重传,不需要手动实现校验流程。
注意:同分区下的文件移动是原子操作,是整个流程不会出现半文件的核心,不要用跨分区复制操作代替移动
内容的提问来源于stack exchange,提问作者vamirio-chan
相关产品推荐
相关产品推荐

