嵌入式局域网优化 — bbolt 数据库集成方案

一、使用场景

  1. 规则状态持久化

    • 当启用持久化后保存每条规则的运行状态对象(最近一次触发时间、状态值、持续时间计数器、触发次数、最近错误信息)。
    • 系统重启或异常恢复时可读取,保证业务连续性。
  2. 本地数据缓存

    • 保存输入数据或输出动作失败队列(如局域网MQTT发送失败、设备控制失败)
    • 支持断电/断网重发。
  3. 配置存储(可选)

    • 保存本地规则配置、窗口参数、输出动作绑定信息。
    • 对于嵌入式设备,可减少对外部存储依赖。

二、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. 数据写入策略

  1. 异步写入

    • 数据源采集、规则执行结果、输出动作失败队列通过异步队列写入 bbolt,避免阻塞主数据通道。
  2. 事务批量提交

    • 对多条数据,使用 db.Batch(func(tx *bbolt.Tx) error {...}) 批量写入,减少 I/O 压力。
  3. 过期数据清理

    • 配置每个 bucket 最大条目或 TTL(如规则状态保留 7 天,缓存队列 24 小时)
    • 定时清理,防止 bbolt 文件膨胀。

3. 数据读取策略

  1. 规则状态恢复

    • 系统启动时,读取 RuleState bucket 全量状态,恢复规则上下文。
    • 支持按 RuleID 查询最新状态。
  2. 窗口缓存读取

    • 若窗口数据写入 bbolt,规则执行时按 WindowID 和时间戳查询历史数据。
    • 支持时间范围查询,保证窗口统计计算准确。
  3. 输出动作失败重试

    • 读取 DataCache bucket,按序号/时间排序依次重发。
    • 成功后删除条目。

4. 性能优化

  1. 单事务写入小批量

    • 避免单条写入频繁创建事务,降低 I/O。
  2. 内存映射读写

    • bbolt 采用内存映射文件 (mmap) 机制,可快速访问数据。
  3. 文件压缩/裁剪

    • 对长期运行设备,定期进行 bbolt 文件备份和压缩,控制文件大小。
  4. 并发读优化

    • bbolt 支持多读单写,保证高并发数据读取不阻塞主线程。

5. 配合前端页面的展示

规则状态可视化

  • 每条规则显示最新状态(RuleState bucket)
  • 展示触发次数、持续时间、最近错误信息

缓存队列监控

  • 显示 DataCache bucket 中待处理/重试的消息数
  • 支持手动清理或重发

窗口数据查看(可选)

  • 按 WindowID 查看历史缓存数据
  • 支持时间范围筛选

6. 局域网嵌入式特点优化

  • 单文件数据库,减少依赖,适合 ARM/X86 嵌入式设备
  • 完全离线运行,无需互联网连接
  • 数据库文件可存储在本地闪存或 SD 卡上
  • 支持断电恢复,无需额外中间件