firebase - Firebase:避免数据库争用:而不是事务,使用更新单个文档中的唯一字段
问题描述
在我的应用程序中逐渐面临 60w/doc/sec 的问题。做了我能想到的所有收集和文档分离策略。我不可避免的瓶颈是对用户帖子的“投票”,每个帖子都保存在一个文档中。
到目前为止,我一直在使用事务来填充具有唯一用户标识符的投票地图。
我的问题是:而不是使用事务来设置 UserID 投票映射,我可以使用:
db.[databasePath].update({'votes.${UserID}': true});
投票地图结构:
votes = {
'user1': false,
'user2': true,
'user3': false,
...
}
如果我不在乎其他人对文档做了什么,并且我在地图中使用了唯一键,我可以相信这种方法来完成更新吗?还是有可能随着许多更新电话的到来,一些选票可能会丢失?
干杯!
解决方案
这不会绕过每个文档每秒写入 1 次的限制。即使您在votes
对象中使用不同的键,您仍然在写入同一个文档。
一种解决方案是在主文档的子集合中为每个投票用户编写一份文档(即代表投票主题的文档)。通过这种方式,您可以写入不同的文档,并且您会受到每秒 1 次写入限制的限制。
如果您需要获得总票数(除了每个用户的 nbr 票数),您可以使用云函数写入事务中的分布式计数器。任何创建投票文档都会触发此 CF。您需要为每个主文档创建一个分布式计数器。
同样,如果您需要知道每个用户(跨主要文档)的总票数,只需更新另一组分布式计数器。
推荐阅读
- java - 用于在 char 'x' 之前选择 upto char before char 'y' 的正则表达式
- google-fusion-tables - 提取GEE中多个点的波段值
- javascript - 发生视频广告跳过按钮事件时,焦点无法转移到 iframe 游戏
- excel - 将excel打印页面转换为pdf并在打印页面上发送到电子邮件
- c++ - 实现nd-array时如何处理C++中的“超出范围”异常
- angular - Angular:如何更改输入类型 =“日期”占位符值
- matlab - 如何将 Gabor 小波应用于 3d 体积?
- javascript - Object.assign() 与 angular.extend()
- excel - 需要帮助以减少以下代码的执行时间
- joomla - 如何在 JSE 中按名称而不是 id 加载模块?