- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们有 动态页面 由 Firebase Cloud Functions 提供服务,但 TTFB
在这些页面上的 TTFB 非常慢900ms - 2s
,起初我们只是假设它是一个冷启动
问题,但即使流量稳定,在700ms - 1.2s
的TTFB也很慢>.
这对我们的项目来说有点问题,因为它依赖于自然流量,而且 Google Pagespeed 需要小于 200ms
的服务器响应。
无论如何,我们尝试检查可能导致问题的原因并使用 Firestore 进行了定位,当云函数访问 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 调用 1 执行时间、Firestore 调用 2 执行时间] TTFB
如果我们检查测试结果,有迹象表明 TTFB 正在变低,可能是 Cloud Function 已经预热的时候?但即便如此,根据我们第二次 Firestore 调用的结果,Firestore 在 Cloud Function 中消耗了 200-300 毫秒,即使 Firestore 执行时间较短,TTFB 仍将占用 600-800 毫秒,但那是另一回事。
无论如何,任何人都可以帮助我们如何提高 Cloud Functions 中的 Firestore 性能(或者如果可能的话,提高 TTFB 性能)?也许我们正在做一些我们不知道的明显错误的事情?
最佳答案
我会尽力提供帮助,但在返回 dynamicPages
之前可能缺少一些关于您加载的内容的上下文,但这里有一些线索:
首先,最明显的部分(无论如何我都要指出来):
1 - 注意如何测量 TTFB:
Measuring TTFB remotely means you're also measuring the network latency at the same time which obscures the thing TTFB is actually measuring: how fast the web server is able to respond to a request.
2 - 来自关于 Understanding Resource Timing
(here) 的 Google Developers 文档:
[...]. Either:
Bad network conditions between client and server, or
A slowly responding server applicationTo address a high TTFB, first cut out as much network as possible. Ideally, host the application locally and see if there is still a big TTFB. If there is, then the application needs to be optimized for response speed. This could mean optimizing database queries, implementing a cache for certain portions of content, or modifying your web server configuration. There are many reasons a backend can be slow. You will need to do research into your software and figure out what is not meeting your performance budget.
If the TTFB is low locally then the networks between your client and the server are the problem. The network traversal could be hindered by any number of things. There are a lot of points between clients and servers and each one has its own connection limitations and could cause a problem. The simplest method to test reducing this is to put your application on another host and see if the TTFB improves.
不那么明显的:
您可以在此处查看有关 Cloud Functions Performance
的官方 Google 文档:https://cloud.google.com/functions/docs/bestpractices/tips
您之前需要一些文件吗?
根据 Firebase 云功能的这个答案很慢
:Firebase cloud functions is very slow :
Looks like a lot of these problems can be solved using the hidden variable process.env.FUNCTION_NAME as seen here: https://github.com/firebase/functions-samples/issues/170#issuecomment-323375462
这些加载的动态页面是由 guest
用户还是 logged
用户访问的?因为可能第一个请求要理清身份验证细节,所以众所周知比较慢……
如果这些都不起作用,我将看看常见的性能问题,例如数据库连接(here : 优化数据库性能
)、改进服务器配置、尽可能缓存并小心您的应用程序中可能的重定向...
最后,通过互联网阅读,您的问题有很多线程(简单的 Cloud Functions 性能低下)。喜欢这个:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/2374 && 在 S.O: https://stackoverflow.com/search?q=%5Bgoogle-cloud-functions%5D+slow
带有如下评论:
since when using cloud functions, the penalty is incurred on each http invocation the overhead is still very high (i.e. 0.8s per HTTP call).
或:
Bear in mind that both Cloud Functions and Cloud Firestore are both in beta and provide no guarantees for performance. I'm sure if you compare performance with Realtime Database, you will see better numbers.
也许这仍然是一个问题。
希望对你有帮助!
关于node.js - 使用 Cloud Functions 和 Firestore 的 Firebase 动态页面速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50665931/
我在想出一个算法时遇到了麻烦... 我有一系列 GPS 数据,以 1 秒为间隔记录时间、速度、距离。假设距离是米,速度是米/秒。可能有超过 2 小时的数据,或 7200 个点。这里的“时间”字段主要是
使用java排序器,即: Collections.sort(myArrayList, new Comparator() { @Override public int c
有什么区别吗 SELECT * FROM my_table 和 SELECT my_column_id FROM my_table 地点: my_table 有百万行 网站上有大量并发用户进行sql查
有2个样本。 在第一个示例中,使用 orderby 可以更快地获得结果。 (根据 phpmyadmin 速度报告) 在另一个例子中,我没有使用 order by,它给出的结果较慢。 (根据 phpmy
我注意到,如果我将训练数据加载到内存中并将其作为 numpy 数组提供到图中,与使用相同大小的 shuffle 批次相比,速度会有很大差异,我的数据有大约 1000 个实例。 使用内存 1000 次迭
我在 python 中使用破折号。我正在绘制记录到 SQLite 数据库中的实时数据,目前,我正在绘制单个值与时间线图。我计划再添加 20 个图表,但目前,随着时间的增加, plotly 变慢,我认为
我试图调用 hasNext Velocity 模板中的方法,以便根据 foreach 循环中的位置影响行为 - 仅 hasNext没有按照文档工作。 这是 Velocity 用户指南的片段,关于 ha
在我正在制作的游戏中,我有两个点,pt1 和 pt2,我想计算出它们之间的角度。我已经在较早的计算中计算出距离。显而易见的方法是对垂直距离上的水平距离进行反正切 (tan(theta) = opp/a
我经常遇到字符串值不存在和/或为空的情况。这是测试这种情况的最佳方法吗? #if( $incentive.disclaimer && $!incentive.disclaimer != '' )
我想将一个模板nested包含在其他模板cont1,cont2和cont3中。 并且嵌套模板应仅对cont1隐藏一个特定控件。 在包含在cont1中之前,我想为一些标志变量$hideMyControl
是否可以更改从“Windows Azure Media Encoder”输出的音频的播放速度? 我正在使用配置为“WMA High Quality Audio”的“Windows Azure Medi
我使用速度将String(template)与字段合并 hi there I'am ${name}, And I'am ${age} old. velocity将字段${name}和${age}与一种
我使用的是 LockedBitmap 类,它简化了 C# 中位图数据的处理。目前它正在将数据复制到本地 byte[] 数组中,然后通过其类方法访问该数组以获取/设置像素颜色值。 这比直接通过指针访问锁
我尝试在 VM_global_library.vm 文件中添加一堆 #set($x=abc) 语句,但这些变量在我的 VM 模板中不可用。 我想为图像的基本路径等设置一个全局变量。这可能吗? 最佳答案
我的项目结构: -src --main ---java ----makers -----SomeClass ---resources ----htmlPattern.vm 如何告诉 SomeClass
我正在尝试从 Velocity 中的字符串中删除不需要的字符(换行符可以,但不能像 EM 和 CAN ASCII 控制字符那样)。 #set($cleanScreen = $cleanScreen.r
我想在日.月.年之间的点处分割日期。例如:2015 年 1 月 14 日至 {14, 01, 2015}这是我使用的代码:dates3.get(0) 包含我从页面的文本字段获取的字符串“14.01.2
之后,从 1.5 升级到速度引擎 1.7 出现了 1.5 没有的问题。为了解释这个问题,我必须展示一个代码片段: #foreach($someVariable in $someCollection)
我想知道从表中选择所有字段是否更快: SELECT * 或只选择您真正需要的: SELECT field1, field2, field3, field4, field5... 假设表有大约 10 个
我正在尝试模仿照片应用程序的行为,在该应用程序中,用户用手指平移照片并且照片具有一定的速度。由于我不会深入的原因,我不能将 UIScrollView 与它的缩放 UIImageView 一起使用,而是
我是一名优秀的程序员,十分优秀!