首页 > 解决方案 > Firebase:避免数据库争用:而不是事务,使用更新单个文档中的唯一字段

问题描述

在我的应用程序中逐渐面临 60w/doc/sec 的问题。做了我能想到的所有收集和文档分离策略。我不可避免的瓶颈是对用户帖子的“投票”,每个帖子都保存在一个文档中。

到目前为止,我一直在使用事务来填充具有唯一用户标识符的投票地图。

我的问题是:而不是使用事务来设置 UserID 投票映射,我可以使用:

db.[databasePath].update({'votes.${UserID}': true});

投票地图结构:

votes = {
  'user1': false,
  'user2': true,
  'user3': false,
  ...
}

如果我不在乎其他人对文档做了什么,并且我在地图中使用了唯一键,我可以相信这种方法来完成更新吗?还是有可能随着许多更新电话的到来,一些选票可能会丢失?

干杯!

标签: firebasegoogle-cloud-firestore

解决方案


这不会绕过每个文档每秒写入 1 次的限制。即使您在votes对象中使用不同的键,您仍然在写入同一个文档。

一种解决方案是在主文档的子集合中为每个投票用户编写一份文档(即代表投票主题的文档)。通过这种方式,您可以写入不同的文档,并且您会受到每秒 1 次写入限制的限制。

如果您需要获得总票数(除了每个用户的 nbr 票数),您可以使用云函数写入事务中的分布式计数器。任何创建投票文档都会触发此 CF。您需要为每个主文档创建一个分布式计数器。

同样,如果您需要知道每个用户(跨主要文档)的总票数,只需更新另一组分布式计数器。


推荐阅读