我如何使用 etcd 进行原子更新

how do i do an atomic update with etcd

我想了解 etcd 上的 'atomic' 更新是什么。

当我想到'atomic'的时候,我觉得有一个'before'和一个'after'(没有during,如果更新失败,还是'before').

这是一个例子:

curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Hidee Ho'

因此,此时任何人都可以访问该消息并获取当前值:

curl -s http://localhost:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hidee Ho","modifiedIndex":4748,"createdIndex":4748}}

稍后,我可以修改这个值,像这样:

curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Mr Hanky'

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

我不是特别在意时机。如果我执行 Mr Hanky 更新并且后续的值获取器在(短)时间段内继续获取 Hidee Ho,那没关系。

我很困惑,因为协议中有一个 Atomic CompareAndSwap 函数。据我所知,它不是原子性的,而是 'only do the update if the value is what I say it is'。就我而言,我不太关心过去的价值是多少。我只想知道它已更改,并且除了 'before' 或 'after' 值之外,没有读者会看到任何其他内容。

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

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