【问题标题】:How does firebase client know what data to sync?firebase 客户端如何知道要同步哪些数据?
【发布时间】:2017-12-20 22:26:22
【问题描述】:

谁能分享一些关于firebase移动客户端如何知道从服务器下载哪些数据以防网络连接丢失和重新建立的知识?

让我们这么说:

  • 数据库中有一个对象,其键为 key1 和 key3。
  • 移动客户端下载它们并离线。
  • 同时添加了key2和key4
  • 客户端恢复连接并以某种方式接收 key2 和 key4。

它究竟是如何知道发生了什么变化的?

  • 它会再次下载整个集合吗?
  • 它是否会以某种方式交换所有对象的密钥以比较它缺少的内容?
  • 服务器是否记住了哪些客户端拥有什么?
  • 还有别的吗?

【问题讨论】:

  • 你能澄清一下下载它们吗?即,如果您一次观察节点(observeSingleEvent)以“下载”它们,那么即使客户端在线,客户端也不会知道更改。同样,如果您正在监视一个节点是否被删除,并且添加了两个子节点,那么即使该应用程序在线,也不会收到通知。

标签: firebase firebase-realtime-database


【解决方案1】:

服务器会跟踪每个客户端的活动侦听器,但不会跟踪每个客户端知道的内容。

当您将侦听器附加到本地缓存中的某个位置时,客户端会计算缓存数据所有分支的复合哈希键。它将这些哈希发送到服务器,服务器对实际数据执行相同的哈希。如果任何哈希值不同,则数据被修改,因此它从服务器发送回客户端。


请注意,这种散列/交换仅发生在您已缓存并附加侦听器的数据上。您没有收听的任何缓存数据都不会得到这种处理。由于您通常会在应用程序的生命周期内向数据的不同部分添加侦听器,因此散列和同步的成本会在应用程序的生命周期内分散。唯一一次我看到不那么仁慈的行为是开发人员在其数据库的根目录上调用了keepSynced(true),这实质上是在您的应用程序启动时强制执行“巨型同步”。在这种情况下,本地缓存的散列及其同步可能需要大量的时间、内存和带宽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2022-12-03
    • 2018-09-17
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多