嵌入式局域网优化 — bbolt 数据库集成方案
一、使用场景
-
规则状态持久化
- 当启用持久化后保存每条规则的运行状态对象(最近一次触发时间、状态值、持续时间计数器、触发次数、最近错误信息)。
- 系统重启或异常恢复时可读取,保证业务连续性。
-
本地数据缓存
- 保存输入数据或输出动作失败队列(如局域网MQTT发送失败、设备控制失败)
- 支持断电/断网重发。
-
配置存储(可选)
- 保存本地规则配置、窗口参数、输出动作绑定信息。
- 对于嵌入式设备,可减少对外部存储依赖。
二、bbolt 数据库设计
1. 数据库结构(Buckets)
| Bucket 名称 | 存储内容 | 键值设计 |
|---|---|---|
RuleState |
每条规则的运行状态 | Key: RuleID, Value: 序列化 JSON 或 protobuf |
DataCache |
输入数据缓存或输出失败队列 | Key: 自动递增序号 / UUID, Value: 序列化数据 |
Config |
本地配置(规则/动作/窗口) | Key: 配置ID, Value: JSON |
WindowData |
窗口缓存数据(可选) | Key: WindowID:Timestamp, Value: 序列化数据 |
ActionResult |
输出动作历史执行结果 | Key: ActionID:Timestamp, Value: JSON |
设计要点:
- 每个 bucket 单独管理,便于清理和维护;
- 序列化数据可使用 JSON 或 protobuf,节省内存并方便调试;
- 支持批量写入(bbolt 支持事务批量提交,提高性能);
- 小嵌入式设备无需启动外部服务,单文件即可使用。
2. 数据写入策略
-
异步写入
- 数据源采集、规则执行结果、输出动作失败队列通过异步队列写入 bbolt,避免阻塞主数据通道。
-
事务批量提交
- 对多条数据,使用
db.Batch(func(tx *bbolt.Tx) error {...})批量写入,减少 I/O 压力。
- 对多条数据,使用
-
过期数据清理
- 配置每个 bucket 最大条目或 TTL(如规则状态保留 7 天,缓存队列 24 小时)
- 定时清理,防止 bbolt 文件膨胀。
3. 数据读取策略
-
规则状态恢复
- 系统启动时,读取
RuleStatebucket 全量状态,恢复规则上下文。 - 支持按 RuleID 查询最新状态。
- 系统启动时,读取
-
窗口缓存读取
- 若窗口数据写入 bbolt,规则执行时按 WindowID 和时间戳查询历史数据。
- 支持时间范围查询,保证窗口统计计算准确。
-
输出动作失败重试
- 读取
DataCachebucket,按序号/时间排序依次重发。 - 成功后删除条目。
- 读取
4. 性能优化
-
单事务写入小批量
- 避免单条写入频繁创建事务,降低 I/O。
-
内存映射读写
- bbolt 采用内存映射文件 (mmap) 机制,可快速访问数据。
-
文件压缩/裁剪
- 对长期运行设备,定期进行 bbolt 文件备份和压缩,控制文件大小。
-
并发读优化
- bbolt 支持多读单写,保证高并发数据读取不阻塞主线程。
5. 配合前端页面的展示
规则状态可视化
- 每条规则显示最新状态(RuleState bucket)
- 展示触发次数、持续时间、最近错误信息
缓存队列监控
- 显示 DataCache bucket 中待处理/重试的消息数
- 支持手动清理或重发
窗口数据查看(可选)
- 按 WindowID 查看历史缓存数据
- 支持时间范围筛选
6. 局域网嵌入式特点优化
- 单文件数据库,减少依赖,适合 ARM/X86 嵌入式设备
- 完全离线运行,无需互联网连接
- 数据库文件可存储在本地闪存或 SD 卡上
- 支持断电恢复,无需额外中间件