
设备上下线写库的批量合并试用安装包下载 | SMS | 在线演示项目地址https://github.com/openskeye/go-vss背景设备/通道上下线可能短时间爆发网络断联、批量重启、心跳风暴。若每次 SIP 事件都立即请求一次 DB RPC会把 DB 连接与写入 IOPS 打满并放大锁竞争。本仓库对在线状态变更做「先攒队列 Map再按秒批量 flush」。项目中的做法1. 事件入口SetDeviceOnlinechannel各逻辑将DCOnlineReq写入 channelSetDeviceOnlineStateLogic主循环读到后以DeviceUniqueId或通道维度为键Set进DeviceOnlineStateUpdateMap。同一键多次翻转时后写覆盖前写自然合并抖动。2. 批量 flushproc每秒一次proc中time.NewTicker(time.Second)遍历 Map按设备 / 通道、在线 / 离线分成四个切片分别go setDevice(...)/go setChannel(...)做批量更新最后Clear()整个 Map进入下一秒。心跳超时REGISTER 下线通道状态SetDeviceOnlineDeviceOnlineStateUpdateMap覆盖合并Ticker 1s聚合四类切片setDevice / setChannel批量 RPCMap.Clear()要点延迟与吞吐的权衡状态落库最坏延迟约1 秒换得的是写合并与更低 DB QPS。对大屏「在线数」类展示通常可接受。最后一次覆盖若 1 秒内同一设备「上→下→上」Map 中只保留最后一次flush 时可能少一次中间态写入这是性能优化常见取舍。与 Catalog 联动setDevice内对下线设备会停止 Catalog定时代码后续逻辑避免离线设备仍被周期 Catalog。相关代码路径core/app/sev/vss/internal/logic/gbs_proc/set_device_online_state_loop.gocore/app/sev/vss/internal/types/types.go—SetDeviceOnline、DeviceOnlineStateUpdateMap