作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常简单的云函数,可以将单个值写入我的实时数据库。代码在这篇文章的底部。
查看日志,我发现执行时间非常不一致。这是一个屏幕截图:
您可以看到它低至 3 毫秒(太棒了!)和高达 579 毫秒(非常糟糕 - 我已经看到它达到 1000 毫秒)。结果是我的聊天室实现出现了非常明显的延迟,消息有时会按发送顺序乱序附加。 (即“1”“2”“3”被接收为“2”“3”“1”)
为什么执行时间变化如此之大?冷启动与热启动似乎并不适用,因为您可以看到这些调用一个接一个地直接发生。我也找不到任何记录的实时数据库写入/秒限制,这与 firestore 文档的 1 写入/秒限制不同。
代码如下:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
const messagesRef = admin.database().ref('/messages/general');
export const sendMessageToChannel = functions.https.onCall(async (data, context) => {
if (!context.auth) {
throw new functions.https.HttpsError(
'failed-precondition',
'User must be logged-in.'
);
}
try {
await messagesRef.push({
uid: context.auth.uid,
displayName: data.displayName,
body: data.body
});
} catch (error) {
throw new functions.https.HttpsError('aborted', error);
}
});
编辑:我见过this similar question从两年前开始,响应者表示任务本身具有可变的执行时间。
这里是这样吗?实时数据库的写入时间是否变化很大(大约 330 倍,从 3 毫秒到 1000 毫秒!)?
最佳答案
根据代码,这是很难控制的。
你在那里进行了很多步骤:\
因此您不能简单地依靠响应时间来组织消息传递顺序。
您应该在客户端设置服务器端时间戳以进行跟踪。
您可以使用以下解释的代码片段实现此目的:
try {
message.createdAt = firebase.firestore.FieldValue.serverTimestamp() // server-side timestamp
... // calls to functions
} catch(err) {
console.log("Couldn't set timestamp or send to functions")
}
通过这种方式,您可以在发送要保存的消息之前为消息设置一个服务器端时间戳,这样您的用户就可以看到消息何时被注册(时间戳)、保存(函数调用)和确认(发送时为 200)。
关于node.js - 云功能的执行时间激增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64289295/
我是一名优秀的程序员,十分优秀!