Skip to main content

Module refresh

Module refresh 

Source
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§

RefreshService
刷新服务句柄:持有表快照库、信号接收端与各表任务(drop 时中止全部任务)。
RefreshSignal
一次成功换代后的通知(纯信号,无数据载荷——数据在 TableStore,调用者 收到信号后用函数调用 TableStore::snapshot 取当前代)。
RefreshSpec
一条定期刷新规格。
TableData
一代数据集快照(不可变):knowdb 换入 store、调用者共享读取。
TableStore
表快照库:表名 → 当前代 Arc<TableData>

Enums§

RefreshSource
数据源刷新方式。

Constants§

DEFAULT_SIGNAL_CAPACITY
信号通道容量(满则丢弃单次信号,绝不阻塞刷新周期——数据已在 store 换代)。

Functions§

load_rows
同步装载一次(启动首次取数用;与周期 tick 内部 reload 同一渲染/查询语义, 只是走同步 facade,供调用者在启动这一同步上下文里拿首批行)。