使用Cloud Functions和Firestore的Firebase动态页面速度很慢

Jo *_* E. 12 node.js firebase google-cloud-functions google-cloud-firestore

我们有动态页面Firebase云功能提供服务,但在TTFBTTFB的这些页面上速度非常慢900ms - 2s,起初我们只是认为这是一个cold start问题,但即使流量一致,它在TTFB的速度也非常慢700ms - 1.2s.

这对我们的项目来说有点问题,因为它依赖于自然流量,而Google Pagespeed需要服务器响应小于200ms.

无论如何,我们试图检查可能导致问题的原因,我们用Firestore查明了它,当Cloud Function访问Firestore时,我们注意到有一些延迟.这是我们如何实现Cloud Function和Firestore的基本示例代码:

dynamicPages.get('/ph/test/:id', (req, res) => {

    var globalStartTime = Date.now();
    var period = [];

    db.collection("CollectionTest")
        .get()
        .then((querySnapshot) => {

            period.push(Date.now() - globalStartTime);

            console.log('1', period);

            return db.collection("CollectionTest")
                .get();

        })
        .then((querySnapshot) => {

            period.push(Date.now() - globalStartTime);

            console.log('2', period);

            res.status(200)
                .send('Period: ' + JSON.stringify(period));

            return true;

        })
        .catch((error) => {

            console.log(error);
            res.end();

            return false;

        });

});
Run Code Online (Sandbox Code Playgroud)

这是在Firebase + Cloud Functions + NodeJS上运行的

CollectionTest非常小,里面只有100个文档,每个文档都有以下字段:

directorName: (string)
directorProfileUrl: (string)
duration: (string)
genre: (array)
posterUrl: (string)
rating: (string)
releaseDate: (string)
status: (int)
synopsis: (string)
title: (string)
trailerId: (string)
urlId: (string)
Run Code Online (Sandbox Code Playgroud)

通过此测试,我们将得到以下结果:

[467,762] 1.52s
[203,315] 1.09s
[203,502] 1.15s
[191,297] 1.00s
[206,319] 1.03s
[161,267] 1.03s
[115,222] 843ms
[192,301] 940ms
[201,308] 945ms
[208,312] 950ms
Run Code Online (Sandbox Code Playgroud)

此数据是[ Firestore Call 1 Exectution Time,Firestore Call 2 Exectution Time ] TTFB

如果我们检查测试结果,有迹象表明TTFB正在降低,也许是云功能已经预热了?但即便如此,基于我们第二次Firestore Call的结果,Firestore在Cloud Function中耗尽了200-300ms,即使Firestore执行时间较短,TTFB仍然需要600-800ms,但这是另一回事.

无论如何,任何人都可以帮助我们如何在我们的云功能(或者如果可能的话,TTFB性能)中改进Firestore性能?也许我们正在做一些我们不知道的明显错误的事情?

JP.*_*let 1

我会尽力提供帮助,但可能缺乏一些关于返回之前加载的内容的背景信息dynamicPages,但这里有一些线索:

首先,显而易见的部分(无论如何我都必须指出):

1 - 注意如何测量 TTFB:

远程测量 TTFB 意味着您同时还测量网络延迟,这掩盖了 TTFB 实际测量的内容:Web 服务器能够响应请求的速度。

2 - 以及来自 Google 开发者文档Understanding Resource Timing此处):

[...]。任何一个:

Bad network conditions between client and server, or
A slowly responding server application
Run Code Online (Sandbox Code Playgroud)

为了解决高 TTFB 问题,首先要切断尽可能多的网络。理想情况下,在本地托管应用程序并查看是否仍然存在大 TTFB。如果有,则需要优化应用程序的响应速度。这可能意味着优化数据库查询、对内容的某些部分实施缓存或修改 Web 服务器配置。后端速度缓慢的原因有很多。您需要对您的软件进行研究,并找出哪些内容不符合您的性能预算。

如果本地 TTFB 较低,则客户端和服务器之间的网络存在问题。网络遍历可能会受到多种因素的阻碍。客户端和服务器之间有很多点,每个点都有自己的连接限制,可能会导致问题。测试减少这种情况的最简单方法是将应用程序放在另一台主机上,看看 TTFB 是否有所改善。

不太明显的:

您可以查看有关Cloud Functions Performance此处的 Google 官方文档:https ://cloud.google.com/functions/docs/bestpractices/tips

您之前需要一些文件吗?

根据这个答案Firebase cloud functions is very slowFirebase云功能非常慢

看起来很多这些问题都可以使用隐藏变量 process.env.FUNCTION_NAME 来解决,如下所示: https://github.com/firebase/functions-samples/issues/170#issuecomment-323375462

这些动态页面加载是被guest用户访问还是被logged用户访问?因为也许第一个请求必须整理身份验证详细信息,所以众所周知它会比较慢......

如果这些都不起作用,我将看看常见的性能问题,例如数据库连接(此处:)Optimize Database Performance、改进服务器配置、缓存所有可能的内容并处理应用程序中可能的重定向...

最后,通过互联网阅读,有很多线程与您的问题有关(简单云函数的性能低下)。像这样的: https: //github.com/GoogleCloudPlatform/google-cloud-node/issues/2374 && in SO:https://stackoverflow.com/search ?q=%5Bgoogle-cloud-functions%5D+slow

评论如:

由于使用云函数时,每次http调用都会产生惩罚,因此开销仍然非常高(即每次HTTP调用0.8s)。

或者:

请记住,Cloud Functions 和 Cloud Firestore 均处于测试阶段,不提供性能保证。我确信如果您将性能与实时数据库进行比较,您会看到更好的数字。

也许这仍然是一个问题。

希望能帮助到你!