Apache zookeeper 动物园管理员限制';s znode版本统计?

Apache zookeeper 动物园管理员限制';s znode版本统计?,apache-zookeeper,Apache Zookeeper,在中,znode的版本号是单调的,每次修改节点时都会更改。这用于实现原子更新,如果版本号与指定的版本号不完全一致,则set操作将失败 但是,删除znode然后重新创建它会重置其版本号。 想象一下这个场景,其中一个进程试图以原子方式增加一个值“/x”: 进程A读取一个znode“/x”。它具有值“1”和版本1 进程B删除“/x” 进程C创建“/x”并将值设置为“0”。版本号现在为0 进程D更新“/x”并将值设置为“100”。版本号现在是1 进程A将1添加到其“/x”的读取副本中,得到“2”。进程A

在中,znode的版本号是单调的,每次修改节点时都会更改。这用于实现原子更新,如果版本号与指定的版本号不完全一致,则set操作将失败

但是,删除znode然后重新创建它会重置其版本号。 想象一下这个场景,其中一个进程试图以原子方式增加一个值“/x”:

  • 进程A读取一个znode“/x”。它具有值“1”和版本1
  • 进程B删除“/x”
  • 进程C创建“/x”并将值设置为“0”。版本号现在为0
  • 进程D更新“/x”并将值设置为“100”。版本号现在是1
  • 进程A将1添加到其“/x”的读取副本中,得到“2”。进程A尝试将“/x”设置为版本为1的“2”
  • 由于版本号正确,写入成功
  • 现在,试图增加一个数字实际上导致它下降了98! 请注意,这不是理论上的,我创建了一个测试用例来演示这种情况

    所以我的问题是:

    在任何时候都可能删除和重新创建节点的情况下,如何在zookeeper中正确实现原子更新?或者这是系统的一个基本限制,并且只有当znode路径从未被重复使用时才是正确的