firebase云功能中的异步任务

时间:2018-01-25 10:55:21

标签: node.js firebase google-cloud-functions

我想通过firebase云功能实现一个函数。

在此功能中,当它收到来自客户端的请求时,我将客户端的ID和分数保存到字典中。通常,我会将这些数据保存到firestore并响应客户端,但我想将写操作保存到firestore,所以我将更新客户端的数据并响应客户端。检查每15个小时,我将字典中的所有数据保存到firestore并重置它。

这是我写的主要流程:

var dic = {}; //save the temp data of client
var timeNow = new Date().getTime();  //get Time when function was deployed
exports.testSucCollectionQueryFunction = functions.https.onRequest( (request, response) => {
      getDataInfoFromRequest();  //id, and score
      dic[id] = score;  //update data info
      response.send(result); // only response that cloud had received request
      if (currentTime - timeNow > 15 minutes) {
           saveDatainDicToFireStore(); 
           dic = {};   //reset Dictionary
      }
}

我测试了来自客户端(< 5)的小型并发连接,它仍然可以。但我不知道1000次请求/秒会发生什么。 那么,你能否帮我解决一下这个问题呢? 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

所以这里有一些问题。

首先,response.send(result);应该是函数中的最后一行代码。致电响应后,您正在向云功能发送信号,告知您功能已完成。虽然响应之后的代码可能会运行,但并不能保证。我指的是你的if语句:

if (currentTime - timeNow > 15 minutes) {
    saveDatainDicToFireStore(); 
    dic = {};   //reset Dictionary
}

接下来,云功能无论是Firebase,AWS Lambda还是Azure功能都应该是无状态的。根据您的工作负载,它们可能是Firebase功能系统创建的多个容器,您无法控制将数据缓存到哪个实例。此外,在15分钟内,这些实例可能因不活动而关闭,您的字典将完全丢失。

如果我是你,我会重新设计你的架构。我要么写入Firestore数据库中的临时位置,它将充当"缓存"机制。然后设置一个单独的HTTP函数,您将每15分钟调用一次,以聚合该缓存数据并将其保存到您的预期位置。

或者只是将数据正确地写入特定位置而不是缓存它。最后,另一种方法是将其写入文件并将该文件保存在Firebase云存储存储桶中以供以后处理,然后使用之前的单独HTTP功能来聚合数据并将其写入Firestore。