首页 > 解决方案 > Firestore - 如果大于零,则减少数字

问题描述

想象一下 1 个用户可以按下一个将计数器重置为 0 的按钮。

另一方面,想象多个用户(例如 100k)可以同时或随时增加/减少同一个计数器。

计数器永远不能低于 0。

我想做的是运行一个事务(读取值,然后在必要时更新),但这似乎是,如果在事务完成之前多次更新计数器,它将一次又一次地重复,并且可能会忽略一些如果计数器在短时间内更新 100k 次并且事务失败(由于多次重复,可能我错了),则增加。

是通过事务处理此问题的唯一方法吗?

标签: firebasegoogle-cloud-firestoretransactions

解决方案


您所描述的内容被称为争用瓶颈,并且是多用户系统中的常见限制。

如果在您的情况下对相同数据进行 100k 次并发更新是一个现实的场景,那么您将需要寻找一种不同的方法来解决它。

想到的第一个,一般来说,一个常见的解决方案是让用户将他们的增加/减少写入一个单独的“队列”。这可以是 Firestore 中的一个集合,但最重要的是这些是仅追加操作:多个用户同时写入之间不存在争用。

然后,您将拥有一个 Cloud Run 实例或 Cloud Functions 来处理来自用户的增加/减少操作。您可以将其限制为最多一个并发或几个并发,从而导致更新最终计数器时没有争用或低争用。


推荐阅读