将分布式计数器应用于云代码

时间:2017-12-28 23:57:50

标签: firebase firebase-realtime-database google-cloud-firestore

我希望实现一个'喜欢'系统,我知道因为我受到每秒一次更新的限制,我应该使用分布式计数器来实现这一点。 https://firebase.google.com/docs/firestore/solutions/counters

这个概念相对简单,基本上你只有一堆段(碎片),你可以把它们全部搞定。 然而,我没有得到的是当你去增加一个柜台时:

function incrementCounter(db, ref, num_shards) {
    // Select a shard of the counter at random
    const shard_id = Math.floor(Math.random() * num_shards).toString();
    const shard_ref = ref.collection('shards').doc(shard_id);

    // Update count in a transaction
    return db.runTransaction(t => {
        return t.get(shard_ref).then(doc => {
            const new_count = doc.data().count + 1;
            t.update(shard_ref, { count: new_count });
        });
    });
}

这似乎抓住了一个随机增加的分片。我想这个想法即使你不小心抓住相同的两个分片也没有问题,因为它在一个事务中递增,但那时只有一个字段?我猜它是这样你可以有更快的更新,你玩一点概率游戏。它只是感觉有点hacky。

0 个答案:

没有答案