项目背景:
在工业物联网(IIoT)快速发展的当下,工业生产场景中设备数量激增,生产数据呈现出海量、实时、多维度的特点。企业对生产过程的精细化管控需求日益迫切,不仅需要实时获取设备运行数据,更需要对这些数据进行快速运算处理,以生成如设备用量、运行耗时、积分等具有业务价值的信息,为生产调度、质量管控、设备维护等决策提供支撑。
功能包括:通过TCP订阅设备数据,接收数据并实时计算,计算算法实现(读数转用量,耗时统计等),数据过滤算法实现,计算结果持久化,重算队列实现
业务流程:
1. 通过 TCP 协议与消息队列(MMQ)建立连接,准备订阅设备生产数据
2. 从数据库加载计算模型并初始化计算项目
3. 从备份快照恢复数据到内存
4. 启动周期性的持久化任务协程
5. 启动重算重算协程池
6. 启动备份快照到磁盘协程
7. 发起数据订阅
8. 启动数据接收协程,并接收数据
9. 数据条件匹配和过滤
10. 调用计算算法,并将结果实时更新到内存
11. 周期性的任务协程从内存加载结果持久化到数据库
12. 客户端通过API请求相对应的结果数据
架构风格:事件驱动 + 采用分层设计 核心模块解耦,通过消息队列和协程池实现异步处理。
模块划分及技术栈
1. 通信接入层
职责:负责与外部系统建立连接和数据接收
TCP客户端连接管理
数据订阅和接收
协议解析和数据校验
技术栈:
net (Golang标准库) - TCP连接
context - 连接生命周期管理
自定义协议解析器
2. 数据过滤层
职责:对接收到的原始数据进行清洗和过滤
数据条件匹配
异常数据检测和过滤
数据格式标准化
技术栈:
正则表达式 (regexp)
条件表达式解析执行(exprgo)
自定义过滤规则引擎
3. 计算引擎层
职责:核心业务计算逻辑执行
技术栈:
自定义计算算法实现
内存数据结构管理
实时计算协程
4. 内存管理层
职责:内存数据的管理和维护
内存快照维护
数据恢复机制
内存数据序列化
技术栈:
sync - 并发安全控制
序列化库 (boltdb)
5. 持久化层
职责:数据持久化存储
周期性数据持久化
6. 重算服务层 (Recalculation Service Layer)
职责:处理数据重算任务
重算队列管理
协程池实现
历史数据加载和重算
技术栈:
协程池实现
任务队列 (channel)
InfluxDB客户端 (用于历史数据查询)
分片查询
难点1:由升级或者服务异常停止造成的计算中断引起的计算误差
解决方案:
每5分钟备份存快照到文件
服务启动时从文件快照恢复
难点2:网络延迟造成的计算误差,也就是到了周期时间时,该周期内的数据因为网络延迟并未全部接受到
解决方案:
实时计算协程判断 数据时间>计算周期的结束时间时,自旋等待最多10s, 并发送信号到周期任务执行协程
周期任务执行协程等待实时计算协程发来的信号,最多等待10s,接受到信号就持久化到内存,并发送信号到
实时计算协程解除自旋
难点3: 重算对服务器的负载过高
解决方案:
实现了协程池,限制同一时间最大的重算协程数量
对长周期时间的数据按时间分片查询,比如月统计,一次查询2小时