本地写入带有附加侦听器的 Firebase RTDB 或 Firestore 是不是需要读取操作?
Posted
技术标签:
【中文标题】本地写入带有附加侦听器的 Firebase RTDB 或 Firestore 是不是需要读取操作?【英文标题】:Do local writes to Firebase RTDB or Firestore with attached listeners cost a Read Op?本地写入带有附加侦听器的 Firebase RTDB 或 Firestore 是否需要读取操作? 【发布时间】:2019-09-19 00:38:46 【问题描述】:在这个firestore官方guide中,它说
应用中的本地写入将调用快照侦听器 立即地。这是因为一个重要的特性叫做“延迟 补偿。”当您执行写入时,您的听众将 在数据发送到后端之前通知新数据
-
所以 Firestore 客户端(发布此数据的)不会通过侦听器从服务器获取此数据?
这是否仍会作为读取操作收费(以防数据未从服务器获取)?
这个概念是否也适用于实时数据库?
我测试了一个客户端向/chats/chatRoomId/
写入新对象,而同一客户端在/chats/chatRoomId/
上有child_added
的侦听器。我关闭了互联网,仍然报告推送新数据正常(我猜是由于离线能力),并且听众也报告接收到新数据(即使没有服务器访问)
我想构建我的聊天应用程序的数据库,这样我就可以在给定here 和here 的聊天数据库结构中减少不必要的读取(如果有)的成本@FrankVanPuffelen 推荐来自 Firebase。
chats: $roomId: $messageId: senderId: "..." message: "..."
示例:
考虑一个 1:1 聊天,其中 userA 和 userB(在不同的客户端上)在一个聊天室中,并且都向/chats/chatRoomId/
添加了一个侦听器。现在,如果用户 A 在chatRoomId
中推送一条新消息,则用户 A 和 B 都将通过他们的侦听器收到这条新消息。这不是浪费带宽和/或 userA 的读取操作成本,因为他自己推送它,并且可能不需要从服务器获取它。
如果本地写入不会花费我为附加侦听器读取的服务器,我会将来自 userA 和 userB 的消息存储在同一路径 /chats/chatRoomId/
和 recommended 中
否则,我想要一个 DB 结构,以便 userA 将只收听来自 userB 的消息。例如
userA 会将 userB 的新消息推送到 /chats/uid_A/uid_B/
,userA 将监听 /chats/uid_B/uid_A/
,其中 userB 正在为 userA 推送新消息。并且客户端会在本地合并这两条按时间排序的路径,得到一个聊天流。
它可能会为我节省 50% 的阅读量,并节省大量的 firebase 费用。
于 2019 年 3 月 5 日编辑:
为问题清晰添加图片:
【问题讨论】:
【参考方案1】:那么 Firestore 客户端(发布此数据的)不会通过侦听器从服务器获取此数据?
当您在本地写入一些数据时,将立即调用快照侦听器。这意味着您的听众将立即收到通知,因为您添加了一些新数据。但请记住,此操作发生在数据发送到 Firebase 服务器之前。
这是否仍会作为读取操作收费(以防数据未从服务器获取)?
没有。只要您已缓存数据并且未将数据与 Firebase 服务器同步,您就无需为 Firestore 中的任何“读取操作”付费。
这个概念也适用于实时数据库吗?
不,不是。 Firebase 实时数据库对 pricing 有不同的概念。
我想构建我的聊天应用程序的数据库,这样我就可以在来自 Firebase 的@FrankVanPuffelen 推荐的 here 和 here 的聊天数据库结构中减少不必要的读取(如果有的话)的成本。
这两个示例都是针对 Firebase 实时数据库的,并且都说明了创建聊天应用的一种非常好的方法。如果您考虑在某个时候尝试将 Cloud Firestore 用于聊天应用程序,您可以在此处找到有关如何创建完整且实用的 Firestore Chat App 的教程。
我也认为您可能对以下文章感兴趣:
https://medium.com/firebase-tips-tricks/how-to-drastically-reduce-the-number-of-reads-when-no-documents-are-changed-in-firestore-8760e2f25e9e【讨论】:
感谢您的回复@Alex,但是,我仍然没有得到实时数据库的答案。我知道它有不同的定价政策,但我想知道 (1) 如果在chats/chatroomId
处向 Realtime DB 写入(新的孩子),在同一路径上触发本地侦听器,将花费我带宽(以 Realtime DB 术语) . PS:我的聊天应用程序已经在使用 Realtime DB,如果可能的话,我只是想降低成本。 (2) 作为具有成本效益的解决方案,您是否推荐 Firestore 而不是 Realtime DB?
对不起,我理解事物有点笨,除非明确说明。 “将数据同步到云会产生成本”-> 一旦数据写入云,这种同步是否包括从服务器(通过侦听器)读取数据?我说的是最初通过缓存读取的第一次读取(而不是当然会消耗带宽的后续读取)
我再次非常抱歉@Alex,您的回复有点混乱。在第 2 点的“答案”中,您回答不会收取阅读费用。但是在您的第二条评论中,您回答“是”(同步会产生成本,其中包括通过侦听器阅读)
如果数据不是来自服务器(来自缓存),则没有成本。与服务器同步会产生成本。关于您的示例,“两个用户 A&B 都将收到此新消息” - 正确。 “A 将通过本地缓存接收它” - 如果两者都在线,则两者都将收到该消息。 A 将消息发送到服务器,第二个将从服务器获取消息。 1. 正确 2. 正确。 3. 是的,如果他在线的话。如果他离线,则在他上线之前不会产生任何费用。现在可以了吗?
是的。这个回复很完美:-)我明白了,谢谢。我将尝试切换到我在问题末尾提到的数据库结构,它可以为我节省每条消息写入的读取成本(与弗兰克推荐的聊天数据库结构相比)以上是关于本地写入带有附加侦听器的 Firebase RTDB 或 Firestore 是不是需要读取操作?的主要内容,如果未能解决你的问题,请参考以下文章
使用 nativescript-plugin-firebase 添加带有查询的事件侦听器
使用 React 路由器参数和 Firebase RTD 创建人类可读的 URL
React Hooks + Firebase Firestore onSnapshot - 正确使用带有反应钩子的 Firestore 监听器