加速云功能

时间:2018-01-02 16:48:39

标签: 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;

      });
    })
}); 

我经历了很多次,它确实有效,只是觉得很慢。还有另一种方法吗?为了使数据库感觉实时,拥有真正更快的计数器变量将是很好的

1 个答案:

答案 0 :(得分:0)

对于将来的读者:

section of the GCP documentation,他们在这里讨论改善云功能性能的方法。

从文档中引用:

  

明智地使用依赖项

     

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

     

如果函数导入模块,则这些模块的加载时间可以   在冷启动期间增加了调用延迟。你可以减少这个   延迟以及部署功能所需的时间   正确加载依赖项而不加载依赖项   功能不使用。

     

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

     

不能保证云功能的状态为   保留以供将来调用。但是,云功能经常   回收先前调用的执行环境。如果你   在全局范围内声明变量,其值可以在以下位置重用   随后的调用,而不必重新计算。

     

这样,您可以缓存可能在其上重新创建可能成本很高的对象   每个函数调用。从功能主体中移动此类对象   扩展到全球范围可能会显着提高性能。   以下示例每个函数仅创建一次重对象   实例,并在到达   给定实例:   在全局范围内缓存网络连接,库引用和API客户端对象尤其重要。有关示例,请参见优化网络。

     

对全局变量进行延迟初始化

     

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

     

如果您在   单个文件,不同的函数使用不同的变量。除非   您使用延迟初始化,可能会浪费资源,   已初始化但从未使用过。

您还可以阅读Google开发者倡导者撰写的文章:Improving Cloud Function cold start time。 总结文章中提到的要点(加快云功能)

  
      
  • 整理依赖性。
  •   
  • 使用依赖项缓存。
  •   
  • 延迟加载
  •