javascript - 在云功能中进行多个 Firestore 查询以避免多个 RTT?
问题描述
介绍
在我的用例中,我有一个呈现 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,但我不知道这段时间大部分是由与数据中心的距离引起的,还是由查询本身引起的,没有考虑到这个距离(从西班牙到爱荷华州)。
在单个云函数(托管在爱荷华州,一次返回所有内容)中实现所有这些查询这一事实能否大大减少执行时间?
谢谢你。
解决方案
很难说,我同意 Doug 在评论中所说的,你可以获得有意义的答案的最好方法是自己进行基准测试,但是,我写这个答案是为了你应该考虑的一些事情:
由于您的应用程序、云功能和您的 Firestore 之间的物理距离导致的延迟:一般来说,距离越小,您的应用程序越快,这在路径中是正确的
you -> cloud function
,cloud function -> cloud firestore
我建议您使用该区域europe-west2(London)
,因为它是您附近的区域同时提供 Firestore 和云功能,后者以 1 级定价。我还发现这个网站可以测量你和 GCP 中区域之间的 ping,不是官方的,但可能很有用。对 firestore 的异步调用(如果您还没有使用它):对每个查询使用异步调用,如果您继续使用单个函数,那么您不必等待每个查询完成后再开始下一个查询,优化您的函数获取所有文档所需的时间。
使用文档的性能提示来提高代码的性能。
推荐阅读
- python - Python在numpy数组中拆分字符串
- mysql - 使用模数运算符在检查约束中出错
- azure - 在编写获取存储帐户密钥的命令时。会有两个密钥,如何在变量中存储一个值
- javascript - 使用 JavaScript 将海报图片替换为 Wordpress 特色图片
- mysql - Mysql:ALTER TABLE 不锁定表?
- perl - 使用 crontab 通过 perl 调用 Java 程序时不运行
- javascript - 是否可以向使用 ReactJS 制作的 Todo 应用程序添加编辑功能?
- java - 如何强制特定的测试类在单独的 jvm 中执行?
- haskell - 安装 zlib 时 ghc.exe 无法执行 ld.exe
- javascript - Javascript - 在一系列跨度之上添加一个新的 DIV