etcd 事务中的原子计数器增量

Atomic counter increment in etcd transaction

我正在使用 etcd 作为数据库,并尝试为原子计数器创建事务。我需要有两个先决条件的交易:

  1. 存在一些密钥,即:clientv3.Compare(clientv3.Version(wantedKey), "!=", 0)
  2. 计数器小于一些 maxVal 即:clientv3.Compare(clientv3.Value(counterKey), "<", maxVal)

问题出在 If() 调用中,我想在同一笔交易中递增/递减该计数器,而不是让第一个 getCounterVal txn 和第二个 inc/decCounterVal (你知道..喜欢compareAndSet) txn..

有人知道怎么做吗? compareAndSet() 上有循环的 2 个 txn 是唯一的方法吗?

是的,不幸的是(令人惊讶的是)etcd 似乎不提供任何原子 inc/dec 操作。似乎唯一的方法是做两个单独的事务,第一个是读取当前值,然后是一个有两个比较的事务加上对密钥版本的检查,如果所有 3 个检查都通过,则放入增量值。

正如您所说,您需要循环执行此操作,因为并发客户端可能已更改第一个事务 (Read) 和第二个事务 (CompareAndSet) 之间的值

这是一种非常低效的处理计数器的方法。 Inc 或 Dec op 会使很多事情变得容易得多,但只有 Put 并且它不能引用任何东西,只是携带一个指定的值。

另请参阅此 Github 问题:https://github.com/etcd-io/etcd/issues/9714