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

时间:2018-01-26 11:25:02

标签: firebase firebase-realtime-database google-cloud-firestore

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

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

根据我对Firestore数据库的理解,无法完成此操作。除非我错过了什么?对于我上面描述的这种用例的计数器,有没有更好的解决方案?

2 个答案:

答案 0 :(得分:6)

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

  

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

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

  

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

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;
    });
}

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

  

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

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

答案 1 :(得分:0)

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

不确定这是否比分布式计数器更具扩展性。