+ 收藏我们

网站模板

网站模板搜索
404模板 营销型模板 外贸网站模板 单页模板 双语模板 标签大全
电话:18630701785
首页 > 站长学院 > etcd 事务中的原子计数器增量 >

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

时间:2024-04-10 09:26:58

知识点掌握了,还需要不断练习才能熟练运用。下面给大家带来一个golang开发实战,手把手教大家学习《etcd 事务中的原子计数器增量》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容
我正在使用 Go 和 etcd 作为数据库,并尝试为原子计数器进行事务。我需要进行一笔有 2 个先决条件的交易:

存在某个密钥,即:clientv3.Compare(clientv3.Version(wantedKey), "!=", 0)
计数器小于某些 maxVal,即:clientv3.Compare(clientv3.Value(counterKey), "<", maxVal)
The problem is at the If() call, I would like to increment / decrement that counter on the same transactions, instead of having 1st getCounterVal txn and 2nd inc/decCounterVal (you know.. like compareAndSet) txn..

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


解决方案

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

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

这是处理计数器的一种非常低效的方式。 inc 或 dec 操作将使许多事情变得更加容易,但只有 put 并且它不能引用任何内容,只能携带指定的值。

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

有一种可能的方法通过使用密钥修订来原子增加值

这是一个演示。我不确定它是否 100% 正确。

    wg := sync.WaitGroup{}
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            ctx, cancel := context.WithTimeout(context.Background(), timeout)
            resp, err := cli.Put(ctx, "/pub/sample_key", "sample_value")
            cancel()
            if err != nil {
                t.Error(err)
            }
            t.Log(resp.Header.Revision)
        }()
    }
    wg.Wait()

有问题可以加入网站技术QQ群一起交流学习

本站会员学习、解决问题QQ群(691961965)

客服微信号:lpf010888

Title