分享一个工业软件定制项目中的数据同步实战经验。
场景
某3C代工厂,视觉检测设备每秒钟产生数十条检测结果。之前的方式是:设备输出日志文件,质检员每小时人工导入一次Excel,再手工录入MES系统。
问题很明显------实时性差、人力成本高、容易出错。需求是让检测数据实时同步到MES,同时支持历史数据查询和趋势分析。
技术选型
-
后端:Spring Boot 2.7 + MyBatis-Plus
-
时序数据库:TDengine(存储原始检测数据)
-
关系数据库:PostgreSQL(存储业务摘要和配置)
-
前端:Vue 3 + ECharts(数据看板)
-
数据采集:基于Modbus TCP协议从视觉设备读取
为什么选择TDengine?
视觉检测设备每秒钟产生30-50条检测结果,一天下来数据量可达数百万条。如果用传统关系型数据库存储,查询良率趋势时响应时间会从秒级退化到分钟级。
TDengine的时序存储引擎对这类高频率、带时间戳的数据做了专门优化,查询同样是7天数据,PostgreSQL需要15秒,TDengine只需要200ms。
核心模块实现
- 数据采集层
通过Modbus TCP协议从视觉设备读取检测结果,使用Java的Modbus库(jamod)实现通信。数据解析后先写入TDengine原始数据表,再同步生成业务摘要写入PostgreSQL。
2.数据同步层
// 数据同步核心逻辑(伪代码示意)
public class DataSyncService {
// 每10秒批量同步一次
@Scheduled(fixedDelay = 10000)
public void syncDetectionData() {
// 1. 从设备缓存读取未同步数据
List<DetectionResult> results = readFromDeviceBuffer();
// 2. 解析并写入TDengine(原始数据)
tdEngineDao.batchInsert(results);
// 3. 聚合统计并更新PostgreSQL(业务摘要)
DetectionSummary summary = aggregate(results);
pgDao.updateSummary(summary);
// 4. 通过REST API推送给MES
mesClient.pushResults(summary);
}
}
3.异常处理机制
MES接口偶发超时(约5%的请求),配置了重试机制(最多3次,指数退避)和熔断降级(超时5秒后降级为异步队列)。
上线效果
-
数据同步延迟从"小时级"降至"秒级"
-
数据录入人力归零
-
良率趋势看板实时更新,管理层可随时查看
📌 如需完整代码片段或详细架构图,欢迎通过CSDN私信交流。