了解 Firestore 定价

Posted

技术标签:

【中文标题】了解 Firestore 定价【英文标题】:Understanding Firestore Pricing 【发布时间】:2018-07-27 23:51:14 【问题描述】:

在创建新应用之前,我想确保定价模型正确。

例如,在电话簿应用程序中,我有一个名为 userList 的集合,其中包含一个用户列表,这些用户是单个文档。

我的列表中有 50k 个用户,这意味着我的收藏中有 50k 个文档。

如果我要获取 userList 集合,它将读取所有 50k 文档。

FireStore 允许 50k 文档读取。这是否意味着总共读取 50k 个文档或每个文档读取 50k 个文档?

在我的电话簿应用程序示例中,如果总共读取 50k 文档,我将在一次通话中用完免费限制。

【问题讨论】:

【参考方案1】:

不要一次性呼叫所有用户。您可以限制查询以获取有限数量的用户。当用户滚动您的查询时,您的查询将获得更多用户。而且由于没有人会滚动 50k 用户,因此您可以摆脱大量成本。这类似于在循环视图的情况下节省内存。

【讨论】:

【参考方案2】:

如果您实际上必须提取 50k 文档的整个集合,您可能应该问的问题是如何正确构建 Firestore 数据库

您很可能需要使用查询WHERE 子句,根据其中的某些条件过滤这些文档。让每个客户端设备在本地保存 50k 个文档听起来像是糟糕的数据库规划,并且可能存在安全风险。

Each returned document from your query counts as 1 read。如果没有与您的查询匹配的内容,则收取 1 次阅读费用。如果有 50k 匹配,则收取 50k 读取费用。

例如,您可以检索已登录用户的文档并收取1 read 类似的费用:

db.collection('userList').where('uid', '==', clientUID)

注意:自 2018 年 10 月起,Firestore 在前 5 万次/天之后每 10 万次读取收取 6 美分 (USD)。

【讨论】:

但这是一个极端的例子,可以澄清我的疑问。一个常见的场景是 doc 中包含 50 个数据项的列表。假设您的应用每天有 1000 名用户,在这种情况下,firestore 也会用完免费限制。将使用实时数据库,因为我的数据不需要复杂的查询。 请记住,文档中“数据项”的数量无关紧要。当 Firestore 从查询返回文档时,它会自动返回其中的所有项目(捆绑为一个对象),这恰好计为 1 次读取。对于 1000 个用户,每个用户检索他们的整个用户文档,总共将收取 1000 次读取费用。根据我对自己的应用程序(类似于 SO)的计算,我预计每月有 20000 名用户每月需要 200 美元的账单,但我们会看看我什么时候(而不是如果)到达那里! "对于您执行的每个查询,即使查询没有返回任何结果,也需要读取一个文档的最低费用。" firebase.google.com/docs/firestore/pricing @Hiwa 感谢您的关注!我已经适当地更新了答案。【参考方案3】:

免费配额适用于您的整个项目。因此,您可以在整个项目下读取 50.000 次文档。

阅读 50K 用户个人资料文档确实会一次性使用该免费配额。

在使用 NoSQL 数据库时,通常应尽量避免阅读大量文档。

访问 Firestore 的客户端应用应该只读取它们将立即显示给用户的数据。而且你不可能在一个屏幕上容纳 50K 用户。

因此,您更有可能遇到对用户集合进行聚合的情况。例如。比如:

统计用户数 统计名为 Frank 的用户数 计算用户名的平均长度

NoSQL 数据库的查询能力通常比传统的关系数据库更受限制,因为它们专注于确保读取可扩展性。将某些内容写入数据库时​​,您经常会做额外的工作,如果作为交换,您可以在从数据库读取时获得更好的性能。

为了获得更好的性能,您需要将这些聚合值存储在数据库中,然后在写入用户配置文件时更新它们。因此,您将拥有一个“userCount”、一个包含“每个唯一用户名的 userCount”的文档和一个“averageUsernameLength”。

有关如何运行此类聚合查询的示例,请参阅:https://firebase.google.com/docs/firestore/solutions/aggregation。对于较低的写入量,您还可以考虑使用 Cloud Functions 来更新计数器。

【讨论】:

我同意你的看法。但这是一个极端的例子,可以澄清我的疑问。一个常见的场景是 doc 中包含 50 个数据项的列表。假设您的应用每天有 1000 名用户,在这种情况下,firestore 也会用完免费限制。将使用实时数据库,因为我的数据不需要复杂的查询。 @Frank Van Puffelen,我还有一个问题可以回答。假设我有一个新闻网站,主页有 10 篇文章。每次用户访问主页时,是否会在我的配额中计算 10 次阅读?或者它是否会计算“标题”、“正文”、“作者”等每个项目,以及每次用户访问我的网站时计算 30 次阅读? @gbland777 这将取决于您的站点结构和 Firestore 结构。对于我的应用程序,新闻提要的每个“项目”都将其所有显示的数据分别包含在 1 个文档中。这确实算作 10 次读取以检索 10 个新闻提要项。然后我缓存这些数据,每当用户点击返回主页时,它都会显示缓存结果,并收取 0 次读取费用。此外,您可以使用 VuexFire 之类的东西(取决于所使用的技术)绑定到一个查询,该查询会在数据库更新时自动更新。在 firestore 文档中阅读更多内容。 另外,您可以创建一个派生文档,其中包含您在应用程序/站点的单个页面上显示的所有内容。我建议您查看 Todd 的 Get to know Cloud Firestore video series,特别是第 3 集和第 5 集。

以上是关于了解 Firestore 定价的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 定价 - Firebase 控制台中的 CRUD 是不是重要?

Firestore:加入与 Firestore 定价

Firebase Firestore 读取和定价

离线缓存数据的 Firestore 定价说明

Cloud Firestore 每次读取定价

Firestore 读/写定价; .limit(25) 算作 25 次读取还是 1 次?