TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 780 subscribers
Post #1617 6
Zenoh 的 put 与 get 存在读写竞态

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
More from @devtoolboxhub
  1. Sep 26, 2026PostgreSQL 复制槽上限参数 max_replication_slots 解析 max_replication_slots 决定共享内存中复制槽数组的长度,仅此而已。它不决…
  2. Sep 26, 2026五仓库架构踩坑:Gitlink 与双 CI Flude 团队复盘了多仓库架构的实践代价。项目从第一分钟起就选择拆分成独立仓库,Pipeline、engine、design-docs…
  3. Sep 26, 2026Xeno Core:TypeScript 后端架构框架 Node.js 复杂系统的架构选型往往决定代码的长期命运。开发者常在两条路之间纠结:要么依赖重度使用实验性装饰器和反射(如…
  4. Sep 25, 2026用 SLO 给 AI Agent 的行为定个预算 Grafana Labs 提出把可靠性工程里的错误预算(error budget)思路用到 AI Agent 上。延迟、token…
  5. Sep 25, 2026Xcode 27.2 改用 JSON 项目格式 Xcode 27.2 用基于 JSON 的 project.xcproj 取代了沿用多年的 project.pbxproj。新建项目…
  6. Sep 25, 2026PostgreSQL 的 max_prepared_transactions 该不该开 prepared transaction 是脱离会话独立存在的两阶段提交事务。执行 PREP…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →