我如何用etcd进行原子更新

Gre*_*reg 3 coreos raft etcd

我试图了解在etcd上的“原子”更新是什么。

当我认为“原子”时,我认为有一个“之前”和“之后”(没有“期间”,并且如果更新失败,则仍然是“之前”)。

这是一个例子:

curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Hidee Ho'
Run Code Online (Sandbox Code Playgroud)

因此,在这一点上,任何人都可以访问该消息并获取当前值:

curl -s http://localhost:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hidee Ho","modifiedIndex":4748,"createdIndex":4748}}
Run Code Online (Sandbox Code Playgroud)

稍后,我可以修改该值,如下所示:

curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Mr Hanky'
Run Code Online (Sandbox Code Playgroud)

结果可以像以前一样获取。更改之前,值“ Hidee Ho”回来,更改之后,值“ Mr Hanky”回来。所以,我的问题是我可以保证其中一个或另一个结果吗?也就是说,我想确认一个或另一个将被返回(而不是结果之间nil值)。

我并不特别在意时间。如果我进行Hanky先生更新,并且随后的值获取程序继续在短时间内获得Hidee Ho,那就可以了。

我很困惑,因为协议中有一个Atomic CompareAndSwap函数。据我所知,它不是原子的,而是“仅当值是我所说的时才进行更新”。就我而言,我并不在乎过去的价值。我只想知道它已更改,除了“ before”或“ after”值之外,没有其他读者会看到。

sup*_*ell 6

您是正确的,因为纯PUT是原子的,因为客户端只会看到先前的值或新的值。

CompareAndSwap功能允许您进行乐观锁定,以便您可以写入取决于先前值的新值,例如计数器。如果要在不使用CompareAndSwap的情况下实现计数器write("count", 1 + read("count")),则将具有类似的内容,在这种情况下,读写是分开的,如果两个调用者同时执行此操作,则它们可能会看到相同的起始值,那么您将失去其中一种增量。使用CAS,调用者可以说只有在先前的值为11时才将其设置为12,现在,如果这同时发生,则其中一个写入将失败,然后可以重新读取并重新应用其增量,以免松动任何增量。