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

Posted

技术标签:

【中文标题】离线缓存数据的 Firestore 定价说明【英文标题】:Firestore pricing clarifications for offline cached data 【发布时间】:2018-04-21 01:59:27 【问题描述】:

Firestore 会向我收取对本地缓存数据的读取查询费用,这对我来说似乎很奇怪,但我在 Firestore Pricing document 中找不到任何相反的说明。如果我强制 Firebase 进入离线模式,然后对我的本地缓存数据执行读取,我是否仍会为检索到的每个单独实体收费?

其次,我的应用程序中的离线用户会向单个实体写入许多小更新。我希望每次更改都在本地保留(以防他们退出应用程序),但我只需要最终一致地保存到云中。当用户重新连接到 Internet 并且 Firestore 刷新本地更改时,我是否会为实体的单个写入请求付费,或者我在离线时发出的每个 update 调用付费?

Firestore 可能非常适合我的用例,但如果离线读取和写入的收费与在线读取相同,那将不是一个负担得起的选择。

【问题讨论】:

【参考方案1】:

正如offical documentation 所说,

Cloud Firestore 支持离线数据持久性。此功能会缓存您的应用正在使用的 Cloud Firestore 数据的副本,因此您的应用可以在设备离线时访问数据。您可以写、读、听和查询缓存的数据。当设备重新上线时,Cloud Firestore 会将您的应用所做的任何本地更改同步到远程存储在 Cloud Firestore 中的数据。

因此,每个使用 Firestore 数据库并将 PersistenceEnabled 设置为 true 的客户端都会维护其自己的内部(本地)数据库版本。插入/更新数据时,首先将其写入此本地版本的数据库。结果,所有对数据库的写入都添加到queue。这意味着一旦您重新上线,存储在那里的所有操作都将在 Firebase 服务器上提交。这也意味着这些操作将被视为独立的操作,而不是一个整体。

但请记住,不要将 Firestore 用作仅脱机的数据库。它实际上被设计为一个在线数据库,可以在断开连接的短期到中期工作。离线时,它将保留写操作队列。随着此队列的增长,本地操作和应用程序启动将减慢。没什么大不了的,但随着时间的推移,这些可能会加起来。

如果Google Cloud Firestore 定价模型不太适合您的用例,请使用Firebase Realtime Database。正如 Firebase 官方博客的 post 中所述,您仍可能希望使用实时数据库的原因之一是:

如上所述,Cloud Firestore 的定价模式意味着每个客户端每秒执行大量小读写操作的应用程序可能比实时数据库中类似性能的应用程序贵得多。

因此,您可以选择哪个选项。

【讨论】:

感谢您的快速回复。 Firestore 将按顺序重放事务是有道理的,因为它旨在成为一个在线优先的数据存储(而不是像 Pouch 或 Realm 那样的离线优先)。您知道本地读取的定价是否与网络读取相同的答案吗?我可能会保留自己的本地缓存,以便定期刷新到 Firestore,但现在我会考虑回答这个问题 @AndyMiller 接受的答案并不能真正回答您的问题“我们是否为本地缓存数据查询收费”。它提供了许多其他有用的信息。你找到答案了吗? @NishanthSreedhara 您无需为本地缓存数据查询付费,但当您重新上线时,队列中的每个操作都将作为单独的写入操作收费。 这个答案是否意味着我的应用程序可以始终依赖于拥有某个数据版本(缓存或云)的最新副本,或者在没有侦听器时是否从缓存中清除数据? 是的。不,即使您停止监听更改,数据也会保留在缓存中。仅当您手动执行或卸载应用程序时才会删除缓存。【参考方案2】:

根据this,如果您想使用 Cloud Firestore 完全离线工作,您可以通过以下方式禁用网络:

FirebaseFirestore.getInstance().disableNetwork()

但是对于第一个用户获取请求,firestore 会导致客户端离线错误,您必须将此错误视为空响应。

【讨论】:

你在哪里看到任何关于错误响应的信息? 在Task类的addOnFailureListener中,DocumentReference的get()方法返回一个Task类型的对象。

以上是关于离线缓存数据的 Firestore 定价说明的主要内容,如果未能解决你的问题,请参考以下文章

Android 上的 Firestore 商店缓存在哪里?

Firestore - 使用缓存直到在线内容更新

firestore在Android的哪里存储缓存?

检索已经离线缓存的文档是不是会被视为已读?

无法在 Firestore 中禁用离线数据

iOS开发本地缓存(数据离线缓存读取释放)