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性能?也许我们正在做一些我们不知道的明显错误的事情?
我会尽力提供帮助,但可能缺乏一些关于返回之前加载的内容的背景信息dynamicPages,但这里有一些线索:
首先,显而易见的部分(无论如何我都必须指出):
1 - 注意如何测量 TTFB:
远程测量 TTFB 意味着您同时还测量网络延迟,这掩盖了 TTFB 实际测量的内容:Web 服务器能够响应请求的速度。
2 - 以及来自 Google 开发者文档Understanding Resource Timing(此处):
[...]。任何一个:
Run Code Online (Sandbox Code Playgroud)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云功能非常慢:
看起来很多这些问题都可以使用隐藏变量 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 均处于测试阶段,不提供性能保证。我确信如果您将性能与实时数据库进行比较,您会看到更好的数字。
也许这仍然是一个问题。
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |