firebase - Firestore - 如果大于零,则减少数字
问题描述
想象一下 1 个用户可以按下一个将计数器重置为 0 的按钮。
另一方面,想象多个用户(例如 100k)可以同时或随时增加/减少同一个计数器。
计数器永远不能低于 0。
我想做的是运行一个事务(读取值,然后在必要时更新),但这似乎是,如果在事务完成之前多次更新计数器,它将一次又一次地重复,并且可能会忽略一些如果计数器在短时间内更新 100k 次并且事务失败(由于多次重复,可能我错了),则增加。
是通过事务处理此问题的唯一方法吗?
解决方案
您所描述的内容被称为争用瓶颈,并且是多用户系统中的常见限制。
如果在您的情况下对相同数据进行 100k 次并发更新是一个现实的场景,那么您将需要寻找一种不同的方法来解决它。
想到的第一个,一般来说,一个常见的解决方案是让用户将他们的增加/减少写入一个单独的“队列”。这可以是 Firestore 中的一个集合,但最重要的是这些是仅追加操作:多个用户同时写入之间不存在争用。
然后,您将拥有一个 Cloud Run 实例或 Cloud Functions 来处理来自用户的增加/减少操作。您可以将其限制为最多一个并发或几个并发,从而导致更新最终计数器时没有争用或低争用。
推荐阅读
- javascript - 使用 jQuery 设置整个选择值
- regex - 正则表达式负面展望没有给出预期的结果
- sonarqube - 声纳认证
- square - TransactionID 中的最大字符数是多少?
- ios - 为什么 CellForRow:在 Xcode 9.3 中调用 17 次
- rust - 为什么在 Rust 元组模式匹配中需要显式借用?
- ios - 如何让 UITests-Runner 能够访问隐私敏感数据
- java - itext - setSimpleColumn 无法理解 llx、lly、urx、ury
- javascript - 如何在 JavaScript 中准备嵌套的键值对列表
- c++ - C++ std::getline() 没有设置 EOF 标志