使用分布式计数器排序数据

Sup*_*007 2 firebase firebase-realtime-database google-cloud-firestore

在Firestore指南中,提到应该使用分布式计数器同时处理单个文档的多个更新.

这让我思考.通过此计数器实现,您如何对数据进行排序?例如,假设我有一个帖子数据库,每个帖子都有自己的upvotes分布式计数器.现在,我想得到20个最受欢迎的帖子.你怎么能这样做?

根据我对Firestore数据库的理解,这是无法做到的.除非我错过了什么?对于我上面描述的这种用例的计数器,有没有更好的解决方案?

Fra*_*len 6

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

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

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

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

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;
    });
}
Run Code Online (Sandbox Code Playgroud)

它还提到了这个的主要缺点:

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

解决此问题的一种方法是定期从分片中读取计数并更新主计数列表.这实质上将整个练习转变为地图缩减解决方案.您需要按计划运行此reduce代码,否则,您仍然会遇到写入速率限制.使用周期性触发的云功能听起来非常理想.