Firebase数据库慢速观察

时间:2017-04-19 09:57:24

标签: ios swift firebase firebase-realtime-database

使用observe方法观察FIRDatabaseQuery时,有时需要10~13秒才能从远程数据库获取数据。这主要发生在应用程序来自后台或刚刚启动时。完成此查询后,后续查询将以远程数据超快速返回。问题不再发生了。

这是我用来观察的代码:

height

这是我在Firebase数据库中的结构:

Firebase Database Structure

其中事件是数据库根目录的子项。

我正在使用Firebase规则来改进索引,如文档中所述:

public static func observeMatchEvents(match: Match) -> QueryObserver
{
    FIRDatabase.database().reference().child("events").queryOrdered(byChild: "match_id").queryEqual(toValue: match.identifier)

    log.debug("Started getting match events...")
    let observer = query.observe(FIRDataEventType.value, with: { (snapshot) in
       log.debug("This sometimes takes 10~13 seconds before it gets executed")
    // Handle data
    })

    return QueryObserver(query: query, handle: observer)
}

我认为这与必须在启动时打开的套接字有关。然而,10~13秒需要很长时间。是否有其他人遇到这种行为并且有人有想法加快这一进程?

编辑: 所以在尝试了这里发布的建议并尝试其他事情后,我终于找到了解决方案。实际上有两个问题:

1)当我开始同时观察太多查询时,发生了减速。由于数据量非常巨大,因此需要花费很长时间来完成这些观察调用。这在timeprofiler中也是可见的,你会发现此时的CPU负载非常大。

2)我发现更令人不安的是设置FIRDatabase.database()。persistenceEnabled = true显着增加了查询的回调时间。在干净安装应用程序并从Firebase获取数据时,它真的很快。但是,每次Firebase数据库将更多数据写入磁盘时,响应时间都会增加,每个请求的响应时间增加超过10毫秒。这样,应用最终将花费10秒钟来完成对数据库的请求。我们注意到我们的Android应用程序也有同样的行为。这里唯一的解决方案是完全禁用数据库上的持久性。

2 个答案:

答案 0 :(得分:2)

根据数据库的大小进行搜索会很慢。理想情况下,您在数据库中创建一个不同的节点,其中键是match_id,然后搜索速度很快。像这样:

{
    "matches": {
        "vodiudtnlmdrjiqhkkdowc15": {
            "subvodiudtnlmdrjiqhkkdowc156hii1jc7phspraa81xp9kuj85ezviixcyaaj162saxs2yl127s9": true
        }
    }
}

然后您可以查询:

.child('matches').child(match.identifier)

这将为您提供具有该匹配ID的所有事件。完成后,您可以循环访问这些内容并直接获取各个记录。为了使这些数据保持最新,请查看firebase函数或滚动自己的函数。

这将非常快,因为它根本不需要进行搜索。

答案 1 :(得分:1)

由于您说这种减速仅在应用变为有效时在初始查询中发生,因此很可能是由Firebase客户端连接到其服务器引起的。

您的应用代码很少,Firebase客户端或Firebase服务器可以做到这一点。但是,您可以通过enabling debug logging了解正在发生的事情,并在初始连接时研究输出。