Zenohex 是 Zenoh 的 Elixir 绑定。作者用它做 put/get 存储实验时发现,put 后立刻 get 偶尔会读到旧值。2000 次循环中约 78 次(3.9%)出现 stale 读取,但紧接着再查一次几乎总能拿到正确值,说明写入只是有短暂延迟窗口,并非数据丢失。
根因在 NIF 实现:put 的 .wait() 只等本地会话把消息发出,不等远端 zenohd 路由实际存储;而 get 是 DirtyIo NIF,会真正等待远端回复。用 Elixir 术语类比,put 像 cast,get 像 call。上游 eclipse-zenoh/zenoh#2511 已跟踪此问题,仍未解决。
作者给出修复方案:封装 ZenohAckPut 模块,put 后立即 get 同一 key 确认,按短间隔重试直到超时。返回三种结果::ok 表示写入并确认成功;{:error, :not_confirmed} 表示 put 成功但超时未确认;{:error, reason} 表示 put 本身失败。用同一 2000 次循环验证,stale 读取和超时均为零。
模块已发布为 zenohackput,含复现脚本和验证脚本,暂未上 Hex,需以 git 依赖引入。若用 Zenoh 的 put/get 做状态交接等需要「写后即读」一致的场景,这个不对称值得留意。
GitHub
#开发者 #工具 #Zenoh #Zenohex #Elixir #存储 #读写竞态
@DevToolboxHub
