Firestore 数据库离线模式损坏

问题描述 投票:0回答:4

我们的应用程序中的 Firestore 数据库离线模式遇到了严重问题,我希望我们只是在某个地方犯了一个愚蠢的错误。鉴于这对我们来说绝对是一场精彩的比赛,任何意见都将不胜感激!一些细节...

  • 我们有几个查询在使用 WiFi 时需要亚秒级的时间,但在离线时可能需要数分钟才能返回。

  • 查询最终会返回正确的数据。

  • 这些都是非常简单的查询。只需返回集合中父 ID 字段与特定值匹配的所有文档即可。

  • 结果集非常小。有时只返回少量文档,但绝不超过 25 个。

  • 它发生在多个查询上,因此它似乎并不特定于一种类型。

  • iOS 和 Android 都会发生这种情况。

  • 我们正在使用 Xamarin 并使用 Plugin.CloudFirestore 库,该库运行良好。虽然它当然有可能与该库相关,但考虑到该库只是包装了本机 API 调用,这似乎值得怀疑。

有什么想法吗?预先感谢!

xamarin google-cloud-firestore offline
4个回答
2
投票

事实证明,在 GetDocument() 中离线时强制“源”缓存可以解决该问题。我们的多分钟查询现在已降至亚秒级。它们甚至比现在连接时更快。


0
投票

当集合的离线缓存变大时,离线查询可能会变慢。 发生这种情况时,查询速度可能会变慢,因为本地设备不具备 Firestore 云服务大规模搜索许多文档的能力。 离线时,您不再获得查询性能随结果集大小扩展的保证。

解决此问题的选项是:

  • 完全禁用持久性
  • 手动初始化一个新的 Firebase 应用程序实例,将其持久性缓存的大小设置为某种管理,并且仅将此应用程序实例用于可能很慢的查询
  • 仅在在线时执行此查询,并指定服务器源

0
投票

Firestore 不是一个“离线优先”的数据库,因此它目前还没有针对本地处理大量数据进行优化,缓存上没有索引,速度取决于您使用的设备、文档的大小和数量您收藏的文件。

如果发现这篇文章可能会帮助您优化离线查询:“为什么我的 Cloud Firestore 查询很慢”,更具体地说是第二个原因(“原因 #2:您的离线缓存太大”) .

首先了解离线模式如何工作非常重要:

...当您查询离线缓存中的文档时,Cloud Firestore 需要解压本地存储的每个文档以供集合使用 查询并将其与您的查询进行比较。或者换句话说, 后端的查询会根据结果集的大小进行缩放,但是 在本地,它们会随着集合中数据的大小而缩放 你正在询问。

...如果您在一个集合中有大量数据需要排序 通过,或者您只是在慢速设备上运行,本地操作 大型离线缓存可能会明显变慢。

这意味着在您的具体情况下,离线查询返回多少文档并不重要,重要的是您正在咨询的数据量有多大,特别是在您解释说您时的评论中 “在启动时执行多次读取”

然后这篇文章很好地解释了一些具体问题的解决方案,我将恢复一些要点,但我真的建议您查看完整的文章:

  1. 为您的查询添加限制,以便您仅检索您认为用户需要的数据,并考虑将不需要的详细信息移至子集合中
  2. 不要在缓存中填充超出您需要的数据。
  3. 考虑减小离线缓存的大小。在这一点上,我想指出的是,根据 文档 默认缓存大小阈值为 40 MB,最小值为 1 MB,这可以通过修改
    cacheSizeBytes
  4. 进行配置

希望这些信息和建议可以帮助您了解和解决您的离线查询问题


0
投票

只需添加具有更好格式的 Kotlin 代码的响应:

import com.google.firebase.firestore.Source

val source = if(cachedQuerySnapshot.metadata.isFromCache) Source.CACHE else Source.SERVER
for (queryItem in cachedQuerySnapshot) {
    val items = db.collection(<path>)?.get(source)?.await()
© www.soinside.com 2019 - 2024. All rights reserved.