首页 文章

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

提问于
浏览
11

我们 dynamic pagesFirebase Cloud Functions 服务,但 TTFB 在TTFB为 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;

        });

});

这是在 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)

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

[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

这个数据是[ Firestore Call 1 Exectution TimeFirestore Call 2 Exectution Time ] TTFB

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

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

1 回答

  • 1

    我会尝试提供帮助,但在返回 dynamicPages 之前可能缺少关于你加载的内容的一些上下文,但这里有一些线索:

    首先,明显的部分(我必须指出它):

    1 - 注意如何衡量TTFB:

    远程测量TTFB意味着您还要同时测量网络延迟,这会模糊TTFB实际测量的事物:Web服务器能够以多快的速度响应请求 .

    2 - 来自Google Developers的有关 Understanding Resource Timinghere)的文档:

    [...] . 要么:客户端和服务器之间的网络状况不好,或者
    缓慢响应的服务器应用程序
    为了解决高TTFB问题,首先要切断尽可能多的网络 . 理想情况下,在本地托管应用程序,看看是否还有一个大的TTFB . 如果有,则需要针对响应速度优化应用程序 . 这可能意味着优化数据库查询,为某些内容部分实现缓存或修改Web服务器配置 . 后端可能很慢的原因有很多 . 您需要对您的软件进行研究,并找出不符合您的性能预算的内容 . 如果TTFB本地较低,那么客户端和服务器之间的网络就成了问题 . 网络遍历可能受到任何数量的阻碍 . 客户端和服务器之间有很多要点,每个都有自己的连接限制,可能会导致问题 . 测试减少这种情况的最简单方法是将您的应用程序放在另一台主机上,看看TTFB是否有所改进 .

    不是那么明显的:

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

    Did you require some files before?

    根据 Firebase cloud functions is very slow 的回答:Firebase cloud functions is very slow

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

    加载这些动态页面是由 guest 用户还是 logged 用户访问?因为第一个请求可能需要对身份验证详细信息进行排序,因此它的速度较慢......

    如果没有这方面的工作,我将看看常见的性能问题,如数据库连接(hereOptimize Database Performance ),改进服务器配置,缓存尽你所能,并在您的应用程序中处理可能的重定向...

    最后,通过Internet阅读,您的问题有很多线程(简单 Cloud 功能的性能低下) . 喜欢这个:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/2374 && in S.O:https://stackoverflow.com/search?q=%5Bgoogle-cloud-functions%5D+slow

    评论如下:

    因为在使用 Cloud 功能时,每次http调用都会产生惩罚,开销仍然很高(即每个HTTP调用0.8秒) .

    要么:

    请记住,Cloud Functions和Cloud Firestore都处于测试阶段,并不能保证性能 . 我确定你是否将性能与实时数据库进行比较会看到更好的数字 .

    也许它仍然是一个问题 .

    希望能帮助到你!

相关问题