【问题标题】:Reduce read usage on Firestore减少 Firestore 上的读取使用量
【发布时间】:2020-03-31 12:55:01
【问题描述】:

我们目前在 Firebase 上使用免费层,具有 50k 读取和 20k 写入操作的配额。

每天大约有 100 个用户,我们已经超过了读取操作的配额。 Firestore的结构如下:

Firestore-root
    |
    --- steps (collection)
    |   |
    |   --- 20191206 (document)
    |       |
    |       --- users (collection)
    |           |
    |           --- 08yzYycNqYMZw7kdeGBNV9jcg1G2 (document)
    |               |
    |               --- country: "FR"
    |               |
    |               --- name: "florian"
    |               |
    |               --- steps: 24
    |               |
    |               --- updated_at: "2019-12-05T20:25:05Z"

应用程序显示一个按步数排序的用户列表。

所以作为一个简单的计算,在每次应用启动时,如果x 等于存储在users 集合中的用户条目数,则应该读取x+1 文档,代表x+1 读取操作。对于 100 个用户打开应用和 100 个用户条目,它应该已经是 10100 次读取操作(〜每日配额的 20%)。

我的读取操作计算是否正确? (如果 1 次读取操作 = 1 次读取文档)。

另一方面,有没有办法优化 Firestore 结构以减少读取文档的数量?

我们目前有一个使用.limit() 操作的补丁来避免选择所有条目以释放一些读取操作,但这不是永久解决方案。

在一个文档中包含所有步骤数据似乎也是一个糟糕的解决方案,因为每个文档的大小必须小于 1MB。它可以在一段时间内成为一种解决方案,但如果用户群不断增长,它也会成为一种限制。

感谢您对此提出的建议。


编辑 2019/12/06 #1

以下是用于步骤集合的查询(此处适用于 iOS)。

  • 获取特定时间范围内的排行榜(例如:每天 = 20191206,每月 = 201912)
db
    .collection("steps")
    .document(date.string)
    .collection("users")
    .whereField("steps", isGreaterThan: 0)
    .order(by: "steps", descending: true)
    .getDocuments { }

  • 更新特定时间范围内的用户步骤
db
    .collection("steps")
    .document(date.string)
    .collection("users")
    .document(uid)
    .setData([
        "steps": steps,
        "name": name,
        "country": country,
        "updated_at": Date.NowISO8601,
    ])

【问题讨论】:

  • 我们通常根据我们想要执行的查询来构建数据库。如果您需要更好的架构,请告诉我们您要执行哪些查询。
  • 嗨,谢谢@AlexMamo。问题已更新
  • 如果您有 100 个用户,是时候开始考虑采用付款计划来支持这些活跃用户了。免费层用于支持开发,而不是生产。
  • 看到您的疑问,我认为您应该按照 Doug 的建议继续。

标签: firebase google-cloud-firestore nosql


【解决方案1】:

根据Firebase official documentation,您需要为每个文档的读取、写入和删除付费。所以你的计算似乎没问题。

根据用户数量,您可能需要考虑改用付费计划。可能是Flame Plan

但是,这里有一个尽量减少费用的建议:

由于您在谈论基于步数的排行榜之类的东西,我假设您实际上并不需要每隔几秒更新一次。

我会做的是,在每个特定时间范围内进行一次查询,并将值存储在 Cloud Storage 中,您需要为存储大小而不是读取/写入付费(您每月免费获得 5GB)。然后让您的应用从 Cloud Storage 获取数据。

这样,无论您拥有多少用户,您都将获得恒定的读取量。

例如:

100 个用户,每 10 分钟更新一次排行榜

100 x (24x60 / 10) = 14.4K 读取/天

根据您的用例,您也可以遵循类似的写入逻辑。

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 2021-11-23
    • 2021-06-08
    • 1970-01-01
    • 2021-05-22
    • 2019-10-22
    • 2019-02-01
    • 2020-06-07
    • 2019-12-29
    相关资源
    最近更新 更多