我有一个简单的函数,它只执行一个事务来帮助保持列表的计数。
然而,我注意到当我运行它时,执行需要将近5秒钟,这对于函数的简单程度来说似乎很慢。有什么我可以做的或更快的方法来保持柜台吗?
exports.CountCommentsUp = functions.firestore.document('Groups/{groupID}/TextFeedActive/{postID}/Comments/{commentID}').onCreate(event => {
// ref to the parent document
const docRef = admin.firestore().collection('Groups/' + event.params.groupID+ '/Feed/').doc(event.params.postID);
//Along with Creating Counter, We need to create Notification REF
return admin.firestore().runTransaction(function(transaction) {
return transaction.get(docRef).then(function(sfDoc) {
var newCC = sfDoc.data().CommentCount + 1;
transaction.update(docRef, { CommentCount: newCC });
return newCC;
});
})
});
我经历了很多次,它确实有效,只是觉得很慢。还有另一种方法吗?为了使数据库感觉实时,拥有真正更快的计数器变量将是很好的
答案 0 :(得分:0)
对于将来的读者:
有section of the GCP documentation,他们在这里讨论改善云功能性能的方法。
从文档中引用:
明智地使用依赖项
由于函数是无状态的,因此执行环境通常是 从头开始初始化(在所谓的冷启动期间)。什么时候 冷启动时,将评估该函数的全局上下文。
如果函数导入模块,则这些模块的加载时间可以 在冷启动期间增加了调用延迟。你可以减少这个 延迟以及部署功能所需的时间 正确加载依赖项而不加载依赖项 功能不使用。
使用全局变量在将来的调用中重用对象
不能保证云功能的状态为 保留以供将来调用。但是,云功能经常 回收先前调用的执行环境。如果你 在全局范围内声明变量,其值可以在以下位置重用 随后的调用,而不必重新计算。
这样,您可以缓存可能在其上重新创建可能成本很高的对象 每个函数调用。从功能主体中移动此类对象 扩展到全球范围可能会显着提高性能。 以下示例每个函数仅创建一次重对象 实例,并在到达 给定实例: 在全局范围内缓存网络连接,库引用和API客户端对象尤其重要。有关示例,请参见优化网络。
对全局变量进行延迟初始化
如果在全局范围内初始化变量,则初始化代码 将始终通过冷启动调用执行,从而增加了 功能的延迟。如果未在所有代码路径中使用某些对象, 考虑根据需要延迟初始化它们:
如果您在 单个文件,不同的函数使用不同的变量。除非 您使用延迟初始化,可能会浪费资源, 已初始化但从未使用过。
您还可以阅读Google开发者倡导者撰写的文章:Improving Cloud Function cold start time。 总结文章中提到的要点(加快云功能)
- 整理依赖性。
- 使用依赖项缓存。
- 延迟加载