ZooKeeper 的 multi(事务)不只是为了原子性,它还是批量写入最有效的办法。这篇量一下 100 次 create 逐个提交和一次 multi 提交的差别,再验证它的原子性、zxid 和 check 条件。
逐个 create 100 次: 297.9 ms(2.98 ms/个) 一个 multi 含 100 个 create: 6.2 ms(0.06 ms/个) → 快 48 倍
差别主要来自每次写都要等事务日志 fsync(第 55 篇)。如果用异步 API 流水线提交,也能接近这个速度(第 1 篇量到异步写 1 万次/秒),区别是 multi 还保证原子性。
commit 返回 [RolledBackError(), RolledBackError(), NodeExistsError(), RuntimeInconsistency()] 之后 /at 的子节点: [] (a、b 也没有被创建) 不抛异常的写法 commit() 返回的结果列表: ['RolledBackError', 'NodeExistsError']
5 个 create 的 czxid: ['0x209', '0x209', '0x209', '0x209', '0x209'] 全部相同: True 版本一致时 commit → [True, '/derived'] /cfg 被改过之后 commit → ['BadVersionError', 'RuntimeInconsistency'] | /derived2 存在: False
30 个各 50000 字节的 create(合计约 1.5 MiB)一次提交 → ConnectionLoss