Skip to content

三模存储便捷 API

可用性:完整版(Full)专属。头文件 onepath_store.h 面向完整版提供;精简版(Tiny) 下相关声明在头文件中即被剔除,误用在编译期即报错——这是一条明确的能力边界。

一、设计要点

OnePath 暴露三条核心通路:发布→订阅、查询→应答、持久请求→应答。要用它们搭一个分布式 存储节点,过去需要自己拼装一个订阅者(摄入数据变更)、一个应答器(响应查询)以及一套 键值存储。三模存储便捷 API 把这套样板收敛为单个 store 对象。

  • 一次声明,三模绑定onepath_store_open() 在给定签名上同时接好
    • 订阅摄入:收到 PUT 写入、收到 DELETE 删除;
    • 应答查询:响应一次性查询与持久请求器查询,返回与查询签名相交的条目。
  • 默认内置内存表optsNULL 即用内置线程安全键值表,二进制安全。
  • 可插自定义后端:通过 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 回调;
  • destroyonepath_store_close 时释放后端资源(可为 NULL)。

线程安全

put/del 在订阅摄入线程上调用,query 在应答线程上调用;自定义后端须自行保证线程 安全(内置内存表已自带锁)。

后端回调的完整签名、选项结构体字段与各 *_DEFAULT 取值见 三模存储 API

四、所有权与限制

  • onepath_store_open 写出的句柄归调用者所有,用完须 onepath_store_close
  • 内置内存表对传入的键 / 值做拷贝;自定义后端的拷贝策略由实现自行决定。
  • 自定义后端 queryemitval 指针只需在 emit 调用期间有效(内部会立即作为 应答发出)。
  • 应答只返回键与值;若需携带编码 / 元信息,请在值内自行编排。
  • 存储容量受进程内存约束;大规模或需持久化时请通过 opts.backend 接入自有后端。
  • 摄入是异步的:发布方写入后,存储侧经订阅线程入库存在毫秒级传播延迟,随后查询即可读回。

详见 内存管理

与多模冗余的区别

三模存储是单节点三通路便捷封装。若需要多副本投票的冗余容错,见 多模冗余 XMR——两者正交、可叠加。

API 参考

完整的函数签名、选项结构体 onepath_store_opts_t、后端类型与各 *_DEFAULT 宏见 三模存储 API

OnePath™ 是西安汉为信息技术有限公司的注册商标。