Firebase 使用分布式计数器时对数据进行排序

Firebase 使用分布式计数器时对数据进行排序,firebase,firebase-realtime-database,google-cloud-firestore,Firebase,Firebase Realtime Database,Google Cloud Firestore,在Firestore指南中,建议使用分布式计数器同时处理单个文档的多个更新 这让我思考。使用此计数器实现,您如何对数据进行排序?例如,假设我有一个帖子数据库,每个帖子都有自己的分布式投票计数器。现在,我想得到20个投票最多的帖子。你怎么能做到 根据我对Firestore数据库的理解,这是不可能做到的。除非我遗漏了什么?对于我上面描述的这种用例,有更好的计数器解决方案吗?计数器的主要问题是这个限制: 在CloudFireStore中,您只能每秒更新一次单个文档,这对于某些高流量应用程序来说可能太低

在Firestore指南中,建议使用分布式计数器同时处理单个文档的多个更新

这让我思考。使用此计数器实现,您如何对数据进行排序?例如,假设我有一个帖子数据库,每个帖子都有自己的分布式投票计数器。现在,我想得到20个投票最多的帖子。你怎么能做到


根据我对Firestore数据库的理解,这是不可能做到的。除非我遗漏了什么?对于我上面描述的这种用例,有更好的计数器解决方案吗?

计数器的主要问题是这个限制:

在CloudFireStore中,您只能每秒更新一次单个文档,这对于某些高流量应用程序来说可能太低了

解释如何使用分布式计数器解决此问题的同一示例还显示了如何读取计数器总数:

要获取总计数,请查询所有碎片并对其计数字段求和:

function getCount(ref) {
    // Sum the count of each shard in the subcollection
    return ref.collection('shards').get().then(snapshot => {
        let total_count = 0;
        snapshot.forEach(doc => {
            total_count += doc.data().count;
        });

        return total_count;
    });
}
它还提到了这方面的主要缺点:

成本-读取计数器值的成本随碎片数线性增加,因为必须加载整个碎片子集合

解决此问题的一种方法是定期从碎片读取计数,并更新计数的主列表。这实质上将整个练习转化为map reduce解决方案。您将希望按计划运行此reduce代码,否则,您仍然会遇到写入速率限制。使用a听起来很理想。

根据,另一种选择是使用实时数据库替换firestore上的分布式计数器,并且仍然需要定期从实时数据库读取计数并将其写回firestore

不确定这是否比分布式计数器更具可伸缩性