【问题标题】:Make multiple firestore queries in a cloud function to avoid multiple RTTs?在云功能中进行多个 Firestore 查询以避免多个 RTT?
【发布时间】:2020-10-13 02:40:54
【问题描述】:

简介

在我的用例中,我有一个呈现 8 个项目列表的屏幕。每个列表,对 Firestore 进行异步查询(因为它们需要来自不同集合的文档......)。我已经分析了这 8 个查询的执行时间,总共(我等待从这 8 个查询中获取所有数据的时间),我得到了 3 到 6 秒:

执行时间:5539.793ms

对于每个查询,我要检索大约 30 个文档。以下是它们的总体外观:

const query = playersRef
    .where("random", ">=", randomId)
    .where("level", "==", currentUserLevel)
    .where("location.country", "==", currentUserCountry)
    .orderBy("random")
    .limit(30);

问题

我有点困惑。我知道发出 8 个请求会导致 8 个 RTT,但我不知道这段时间大部分是由与数据中心的距离引起的,还是由查询本身引起的,没有考虑到这个距离(从西班牙到爱荷华州)。

在单个云函数(托管在爱荷华州,一次返回所有内容)中实现所有这些查询这一事实是否会大大减少执行时间?

谢谢。

【问题讨论】:

  • 这似乎是您可以针对自己的具体情况进行基准测试以获得明确答案的东西。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

这很难说,我同意 Doug 在 cmets 中所说的,你可以通过自己进行基准测试来获得有意义的答案的最佳方法,但是,我写这个答案是为了你应该考虑的一些事情:

  • 由于您的应用、云功能和您的 Firestore 之间的物理距离导致的延迟:一般来说,距离越小,您的应用越快,这在路径 you -> cloud functioncloud function -> cloud firestore 中是正确的,我建议您使用区域europe-west2(London),因为它是您附近的区域,同时提供 Firestore 和云功能,后者以 1 级定价。我还发现了这个site,它可以测量您与 GCP 中的区域之间的 ping,不是官方的,但可能很有用。

  • 对 firestore 的异步调用(如果您还没有使用它):对每个查询使用异步调用,如果您继续使用单个函数,这样您就不必等待每个查询在开始下一个查询之前完成查询,优化函数获取所有文档的时间。

  • 使用documentation 的性能提示来提高代码的性能

【讨论】:

  • 是的,我在我的代码中对 firestore 进行了异步调用。我已经移动了所有这些读取(在大约 25 个文档的查询中读取了大约 180 个文档)。结果减少了大约 0.5(有时是 1)秒。缺点是有点不可读的代码,并且对 GCF 进行了额外的调用(因为我们不直接从客户端咨询)。不过时差还不错。
【解决方案2】:

似乎批处理写入或事务可以帮助您解决这个问题... 链接:firebase docs about batch writes and transactions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多