系统需要支撑高并发的实时电信号上传,并对接了深度学习模型进行电器类型识别。为此,我做了几个关键设计:
用 JWT 做无状态认证,保障 API 和 WebSocket 的安全;
用 WebSocket 把采样的电信号流式推送到前端,Vue 界面实时绘制波形;
用 Redis 做波形片段缓存、设备状态存储和分布式锁,防止多实例重复处理;
模型服务由 Python 团队使用 PyTorch 提供,我通过 gRPC 协议与之通信,利用 Protobuf 序列化提升性能,并针对长波形数据采用了服务端流式调用。
主要用在三个场景:实时波形缓存、设备在线状态管理、以及任务防重锁。
1. 实时波形缓存(String + TTL)
现场采集终端每秒上传几百个电流采样点,WebSocket 需要不断推给前端。但有时前端页面刷新或短暂断线,会丢失一小段历史波形。我用 Redis 为每个采集通道维护一个 List,LPUSH 最近的 200 个采样点,LTRIM 保持固定长度,同时用 String 缓存当前秒的聚合值。前端重连后先从 Redis 拉取缺失的少量数据,再接收实时推送,保证波形连续。
2. 设备在线状态(Hash + Expire)
每个采集设备上报心跳,我用 HSET 写入 device:{id} 的 last_heartbeat 和 status,然后 Expire 设置 10 秒。如果 10 秒内没有新的心跳,key 自动过期,监控服务就能检测到设备离线。
3. 波形处理防重锁(SetNX)
服务有多个实例消费同一通道的波形数据,为防止同一条原始数据被重复分析,我在入库前用 SetNX 创建一个处理锁,key 包含设备 ID 和时间戳,过期时间 5 秒。只要一个实例拿到锁,就负责标准化并写入数据库,其他实例跳过。