etcd 事务中的原子计数器增量
Atomic counter increment in etcd transaction
我正在使用 etcd 作为数据库,并尝试为原子计数器创建事务。我需要有两个先决条件的交易:
- 存在一些密钥,即:
clientv3.Compare(clientv3.Version(wantedKey), "!=", 0)
- 计数器小于一些
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
我正在使用 etcd 作为数据库,并尝试为原子计数器创建事务。我需要有两个先决条件的交易:
- 存在一些密钥,即:
clientv3.Compare(clientv3.Version(wantedKey), "!=", 0)
- 计数器小于一些
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