Expand description
KnowDB 定期刷新异步服务(RefreshService)——数据由 knowdb 持有,函数调用交付。
分层定位:宿主(如主引擎 daemon)启动本服务,服务负责各数据源的周期更新并
把最新一代数据换入服务内的表快照库(TableStore),随后只发信号;
宿主(调用者)收到信号后以函数调用 pull 快照(TableStore::snapshot),
自行把数据搬入自己的消费侧缓存(引擎的 ProviderWindow / join 镜像)。
本模块不感知宿主结构。
交付模型(统一为函数取数,无“事件带行“):
- 启动:调用者先做一次装载(
load_rows(&spec),同步)并换入 store (或自用),此后snapshot(name)即得当前代; - 运行期:每张表一条规格(
RefreshSpec),各自独立计时;tick 重载成功 → 锁外整建新一代Arc<TableData>→TableStore::insert(O(1) 换 Arc 指针, 原子换代)→ 信号通道通知(RefreshSignal{ name },无数据载荷,互不阻塞)。 - 调用者取数 =
store.snapshot(name) -> Option<Arc<TableData>>:短读锁内 clone 一个Arc,零数据复制;拿到的代不可变,可无锁并发读(RCU 语义: 换代不打断持有旧代的调用者)。 - 刷新失败(源不可读 / 装载错误)→ 记 warn 并跳过本次,等待下一周期; 信号通道满 → 丢弃本次信号(不阻塞刷新周期;数据已在 store 换代,调用者 随时 pull 到最新,丢信号无害);宿主关闭 → 服务退出。
- 首次 tick 不立即重载(启动装载由调用者完成),从首个
interval到期开始。
数据源:
RefreshSource::Authority:KnowDB V2 conf + sqlite 权威库文件单表 重载(CSV 重读 → 建表/清空/重灌 → 投影行;见loader::reload_table_rows)。RefreshSource::NamedSql:命名 SQL provider 直查重载 (facade::query_async_for/facade::query_for;PG/MySQL 供给,异步池查询)。 SQL 可含$name占位符,由表级 VEL(变量求值语言,见crate::vel)代码 每 tick 求值替换。
Structs§
- Refresh
Service - 刷新服务句柄:持有表快照库、信号接收端与各表任务(drop 时中止全部任务)。
- Refresh
Signal - 一次成功换代后的通知(纯信号,无数据载荷——数据在
TableStore,调用者 收到信号后用函数调用TableStore::snapshot取当前代)。 - Refresh
Spec - 一条定期刷新规格。
- Table
Data - 一代数据集快照(不可变):knowdb 换入 store、调用者共享读取。
- Table
Store - 表快照库:表名 → 当前代
Arc<TableData>。
Enums§
- Refresh
Source - 数据源刷新方式。
Constants§
- DEFAULT_
SIGNAL_ CAPACITY - 信号通道容量(满则丢弃单次信号,绝不阻塞刷新周期——数据已在 store 换代)。
Functions§
- load_
rows - 同步装载一次(启动首次取数用;与周期 tick 内部
reload同一渲染/查询语义, 只是走同步 facade,供调用者在启动这一同步上下文里拿首批行)。