三模存储便捷 API
可用性:完整版(Full)专属。头文件
onepath_store.h面向完整版提供;精简版(Tiny) 下相关声明在头文件中即被剔除,误用在编译期即报错——这是一条明确的能力边界。
一、设计要点
OnePath 暴露三条核心通路:发布→订阅、查询→应答、持久请求→应答。要用它们搭一个分布式 存储节点,过去需要自己拼装一个订阅者(摄入数据变更)、一个应答器(响应查询)以及一套 键值存储。三模存储便捷 API 把这套样板收敛为单个 store 对象。
- 一次声明,三模绑定:
onepath_store_open()在给定签名上同时接好- 订阅摄入:收到 PUT 写入、收到 DELETE 删除;
- 应答查询:响应一次性查询与持久请求器查询,返回与查询签名相交的条目。
- 默认内置内存表:
opts传NULL即用内置线程安全键值表,二进制安全。 - 可插自定义后端:通过
opts.backend注入自有 / 持久化存储,把摄入与查询接到自有 实现之上。 - 写读统一走通路:写入由发布方经发布→订阅完成,读取由查询方经查询→应答完成;存储 对象本身不提供本地读写接口,只提供只读的条目计数用于观测。
二、快速上手
c
#include <onepath.h>
#include <onepath_store.h>
int main(void)
{
onepath_session_t s;
onepath_open(&s);
/* 在 demo/store 下的通配签名上启动三模存储 (默认内置内存表) */
onepath_store_t st;
onepath_store_open(s, &st, "demo/store/**", NULL);
/* 此后: 任意节点 onepath_put 到匹配签名即被存储,
* 任意节点 onepath_get 该签名即可读回。 */
onepath_store_close(st);
onepath_close(s);
return 0;
}配套示例程序 onepath_store_node(store / put / get / del 四角色)给出完整可运行版本。
三、自定义后端用法
默认内置内存表覆盖大多数场景;当需要持久化、外部数据库或自定义索引时,可通过 opts.backend 注入自有后端。后端只需实现四个回调:
put:订阅摄入到 PUT 时写入 / 更新一个键值;del:订阅摄入到 DELETE 时删除一个键;query:收到查询时遍历与查询签名相交的条目,对每条调用提供的emit回调;destroy:onepath_store_close时释放后端资源(可为NULL)。
线程安全
put/del 在订阅摄入线程上调用,query 在应答线程上调用;自定义后端须自行保证线程 安全(内置内存表已自带锁)。
后端回调的完整签名、选项结构体字段与各 *_DEFAULT 取值见 三模存储 API。
四、所有权与限制
onepath_store_open写出的句柄归调用者所有,用完须onepath_store_close。- 内置内存表对传入的键 / 值做拷贝;自定义后端的拷贝策略由实现自行决定。
- 自定义后端
query中emit的val指针只需在emit调用期间有效(内部会立即作为 应答发出)。 - 应答只返回键与值;若需携带编码 / 元信息,请在值内自行编排。
- 存储容量受进程内存约束;大规模或需持久化时请通过
opts.backend接入自有后端。 - 摄入是异步的:发布方写入后,存储侧经订阅线程入库存在毫秒级传播延迟,随后查询即可读回。
详见 内存管理。
与多模冗余的区别
三模存储是单节点三通路便捷封装。若需要多副本投票的冗余容错,见 多模冗余 XMR——两者正交、可叠加。
API 参考
完整的函数签名、选项结构体 onepath_store_opts_t、后端类型与各 *_DEFAULT 宏见 三模存储 API。