我想通过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次请求/秒会发生什么。 那么,你能否帮我解决一下这个问题呢? 谢谢你的帮助
答案 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。