Firebase:避免数据库争用:在单个文档中对唯一字段使用更新,而不是事务



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

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

我的问题是:与其使用事务来设置 UserID 投票映射,我是否可以只使用:

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

投票地图结构:

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

如果我不在乎其他人对文档执行的操作,并且我在映射中使用唯一键,我可以信任此方法来完成更新吗?或者是否有可能随着许多更新电话的到来,一些选票可能会丢失?

干杯!

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

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

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

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