Skip to the content.

嵌入式局域网优化 — 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

设计要点:


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. 配合前端页面的展示

规则状态可视化

缓存队列监控

窗口数据查看(可选)


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