Firebase 加速云功能
我有一个简单的函数,它只执行一个事务来帮助保持列表的计数 然而,我注意到,当我运行它时,执行它需要将近5秒的时间,就函数的简单程度而言,这似乎真的很慢。有什么我能做的或者更快的方法来保持计数器吗Firebase 加速云功能,firebase,google-cloud-functions,google-cloud-firestore,Firebase,Google Cloud Functions,Google Cloud Firestore,我有一个简单的函数,它只执行一个事务来帮助保持列表的计数 然而,我注意到,当我运行它时,执行它需要将近5秒的时间,就函数的简单程度而言,这似乎真的很慢。有什么我能做的或者更快的方法来保持计数器吗 exports.CountCommentsUp = functions.firestore.document('Groups/{groupID}/TextFeedActive/{postID}/Comments/{commentID}').onCreate(event => { // ref
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;
});
})
});
我看了很多遍,它确实有效,只是感觉很慢。有没有其他方法可以做到这一点?为了让数据库感觉实时,最好还有更快的计数器变量供未来读者阅读:
在这里,他们讨论了提高云功能性能的方法
从文件中引用:
明智地使用依赖关系
因为函数是无状态的,所以执行环境通常是
从头开始初始化(在所谓的冷启动期间)。什么时候
冷启动发生时,将计算函数的全局上下文
如果函数导入模块,则这些模块的加载时间
在冷启动期间增加调用延迟。你可以减少这个
延迟,以及部署功能所需的时间
正确加载依赖项而不加载依赖项
函数不使用
使用全局变量在将来的调用中重用对象
不能保证云函数的状态将是
保留以备将来调用。然而,云的功能通常是
回收以前调用的执行环境。如果你
在全局范围中声明变量,其值可以在
无需重新计算的后续调用
通过这种方式,您可以缓存在其上重新创建可能会很昂贵的对象
每个函数调用。从功能体中移动此类对象
向全球范围扩展可能会导致显著的性能改进。
以下示例仅为每个函数创建一次重对象
实例,并在到达
举个例子:
在全局范围内缓存网络连接、库引用和API客户端对象尤其重要。有关示例,请参见优化网络
执行全局变量的延迟初始化
如果在全局范围内初始化变量,则初始化代码
将始终通过冷启动调用执行,从而增加
函数的延迟。如果某些对象未在所有代码路径中使用,
考虑在需求上懒洋洋地初始化它们:
如果在一个文档中定义了多个函数,这一点尤为重要
单个文件,不同的函数使用不同的变量。除非
如果使用延迟初始化,则可能会在以下变量上浪费资源:
已初始化但从未使用
您也可以阅读由谷歌开发者拥护者撰写的文章:。
总结文章中的要点(加快云功能)
- 修剪依赖项。
- 使用依赖项缓存。
- 延迟加载
什么东西需要5秒钟?是从代码开始到显示的代码结束,还是从创建文档到提交事务?输出:函数执行耗时5589毫秒,状态为“ok”@FrankvanPuffelenso是的,整体函数执行,虽然在输出后不久:函数执行花了342毫秒,但状态“ok”似乎有很多变化如果您看到342毫秒,那么代码本身显然不会导致5秒钟的延迟。第一个可能是一个冷启动,云函数正在为您的代码构建一个新的容器。如果不知道如何在本地复制,就很难更具体。