gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:51:10 26 4
gpt4 key购买 nike

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

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

这是一个例子:

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 更新,并且随后的值 getter 在(短)一段时间内继续获取 Hidee Ho,那就可以了。

我很困惑,因为协议(protocol)中有一个原子CompareAndSwap函数。据我所知,与其说它是原子的,不如说它是“仅在值符合我所说的情况下才进行更新”。就我而言,我不太关心过去的值(value)是多少。我只是想知道它已更改,并且读者不会看到除了“之前”或“之后”值之外的任何内容。

最佳答案

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

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

关于etcd - 如何使用 etcd 进行原子更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30809058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com