加速云功能

jdo*_*oej 4 firebase google-cloud-functions google-cloud-firestore

我有一个简单的函数,它只执行一个事务来帮助保存列表的计数。

然而,我注意到,当我运行它时,执行需要将近 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;

      });
    })
}); 
Run Code Online (Sandbox Code Playgroud)

我看了很多遍,确实有效,只是感觉很慢。有其他方法可以做到这一点吗?为了让数据库感觉实时,如果有更快的计数器变量那就太好了

use*_*158 7

对于未来的读者:

GCP 文档中有一部分讨论了提高云函数性能的方法。

引用文档:

明智地使用依赖项

由于函数是无状态的,因此执行环境通常从头开始初始化(在所谓的冷启动期间)。当发生冷启动时,将评估函数的全局上下文。

如果您的函数导入模块,这些模块的加载时间可能会增加冷启动期间的调用延迟。您可以通过正确加载依赖项而不加载函数不使用的依赖项来减少此延迟以及部署函数所需的时间。

使用全局变量在将来的调用中重用对象

无法保证云函数的状态将被保留以供将来调用。但是,Cloud Functions 通常会回收先前调用的执行环境。如果在全局范围内声明变量,则可以在后续调用中重用其值,而无需重新计算。

通过这种方式,您可以缓存在每次函数调用时重新创建的成本可能很高的对象。将此类对象从函数体移至全局范围可能会带来显着的性能改进。以下示例为每个函数实例仅创建一次重对象,并在到达给定实例的所有函数调用之间共享它: 在全局范围内缓存网络连接、库引用和 API 客户端对象尤其重要。有关示例,请参阅优化网络。

执行全局变量的延迟初始化

如果在全局范围内初始化变量,初始化代码将始终通过冷启动调用执行,从而增加函数的延迟。如果某些对象未在所有代码路径中使用,请考虑按需延迟初始化它们:

如果您在单个文件中定义多个函数,并且不同的函数使用不同的变量,这一点尤其重要。除非使用延迟初始化,否则可能会在已初始化但从未使用过的变量上浪费资源。

您还可以阅读 Google 开发者倡导者撰写的文章:改进 Cloud Function 冷启动时间。总结文章中提出的要点(用于加速云功能)

  • 修剪依赖性。
  • 使用依赖项缓存。
  • 延迟加载