【问题标题】:Firestore Read operations calculation with stream limit change流限制更改的 Firestore 读取操作计算
【发布时间】:2022-01-09 20:42:56
【问题描述】:

在实现一个聊天应用程序时,实时分页似乎很复杂,考虑到消息的不断添加和可能删除,存在许多边缘情况。

为了避免这种情况,我想知道,如果我使用获取最新 50 条消息的流,那么如果用户向上滚动,我会将获取限制增加到 200 条,依此类推。

return firestore
          .collection("chatrooms")
          .doc(chatroomId)
          .collection('messages')
          .orderBy('timestamp', descending: true)
          .limit(documentLimit)
          .snapshots()

这种逻辑会导致: 50 + 200 = 250 次读取。还是 50 + 150 = 200 次读取?

我已阅读文档,但我不确定此案的结果。

【问题讨论】:

  • 对于聊天应用程序,使用实时数据库,并偶尔将对话迁移到 Firestore。实时数据库中 10 亿条 1kkk 消息的成本约为 40-50 美元,而 Firestore 中的成本为 1000 美元。

标签: firebase flutter google-cloud-firestore


【解决方案1】:

在最好的情况下,您启用本地缓存和/或在删除旧的快照侦听器之前附加新的快照侦听器。在这种情况下,将从缓存中读取 50 个现有文档,因此您无需为服务器端文档读取付费。

在最坏的情况下,您已禁用本地缓存并在删除旧侦听器后附加新侦听器。在这种情况下,客户端上不再存在 50 个旧文档,因此也需要从服务器读取(和收费)。

【讨论】:

  • 本地缓存已启用,如何“在删除旧的快照侦听器之前附加新的快照侦听器”,我在增加限制时处理初始流(使用 Riverpods 自动处理功能)并直接创建具有新限制的新流。感谢您的帮助!
  • @YassinSameh 它为你创造了奇迹。您首先要求您在客户端检查 Firebase 之前是否要求它,如果您这样做了,它会加载您拥有的数据并且只检查它是否是新鲜的。如果不是新鲜的,它只会下载有任何变化的文档。
  • 我读过缓存读取仍然被认为是读取,这仅适用于 get() 请求而不是 snapshots() 的情况吗?您还知道在删除旧侦听器之前附加新侦听器是什么意思吗?怎么能做到这一点,或者我上面提到的自动处理和创建新流的流程是否正确? @FrankVanPuffelen
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 2018-03-16
  • 2021-11-22
  • 1970-01-01
  • 2021-06-08
  • 2018-11-25
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多