使用Cloud Functions与Firestore的Firebase动态页面很慢

时间:2018-06-03 11:33:10

标签: node.js firebase google-cloud-firestore google-cloud-functions

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

这对我们的项目来说有点问题,因为它依赖于自然流量,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 Time Firestore Call 2 Exectution Time ] TTFB

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

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

1 个答案:

答案 0 :(得分:1)

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

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

1 - 注意如何衡量TTFB:

  

远程测量TTFB意味着您还在测量网络   同时延迟掩盖TTFB的事实   测量:Web服务器响应请求的速度。

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

  

[...]。之一:

Bad network conditions between client and server, or
A slowly responding server application
     

要解决高TTFB问题,首先要尽量减少网络数量。   理想情况下,在本地托管应用程序,看看是否还有一个大的   TTFB。如果有,那么应用程序需要进行优化   响应速度。这可能意味着优化数据库查询,   为某些内容部分实现缓存或修改   您的Web服务器配置。后端可能有很多原因   慢。您需要对您的软件进行研究并弄清楚   什么不符合你的绩效预算。

     

如果TTFB本地较低,那么客户端和网络之间的网络   服务器是问题。网络遍历可能受到阻碍   任何数量的东西。客户和客户之间有很多要点   服务器和每个服务器都有自己的连接限制   导致问题。测试减少这种情况的最简单方法是放置   您在另一台主机上的申请,看看TTFB是否有所改善。

不那么明显:

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

您之前需要一些文件吗?

根据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阅读,您的问题有很多线程(简单云功能的性能低下)。像这样:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/2374&&在S.O:https://stackoverflow.com/search?q=%5Bgoogle-cloud-functions%5D+slow

评论如下:

  

因为在使用云功能时,会对每个http产生惩罚   调用开销仍然非常高(即每个HTTP调用0.8秒)。

或:

  

请记住,Cloud Functions和Cloud Firestore都在   测试版并不保证性能。我相信你   比较性能与实时数据库,你会看到更好   号。

也许这仍然是一个问题。

希望它有所帮助!