具有Firestore的Firebase Cloud功能的不稳定行为

时间:2018-08-09 10:51:01

标签: google-cloud-firestore google-cloud-functions

我正在经历一个相同云功能的某些不稳定行为。这是场景:

我有一个文件,其中包含约223000个小型数据库记录(每个约512字节),我将它们分成JSON文件,每个记录有5000条记录,并通过iOS应用将其上传到Firebase Storage。

上传会触发云功能,该功能读取并解析JSON文件,将5000条记录分为10个包(每包500条记录),并使用批量写入将其发送到Firestore数据库。仅在成功完成先前的批量写入之后,才触发下一个批量写入。如果批量写入返回错误,则处理批量写入的承诺将失败。

每次成功批量写入后,还会通过事务更新文档以更新记录计数以及Firebase数据库中分支的更新。

我的应用程序将223000条记录正确地分为45个文件,并且也正确上传了。一个文件的大小约为2 MB。相应的云功能也会触发45次。 但是

  • 31倍的云功能正常运行,并在30秒后结束
  • 60秒钟后7倍的云功能超时
  • 5次云功能以此错误结束:

    错误:10已终止:在这些文档上的争用太多。请再试一遍。     在Object.exports.createStatusError(/user_code/node_modules/firebase-admin/node_modules/grpc/src/common.js:87:15)     在Object.onReceiveStatus(/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:1188:28)     在InterceptingListener._callNext(/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:564:42)     在InterceptingListener.onReceiveStatus上(/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:614:8)     在回调时(/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:841:24)

  • 数据库的“记录”非常相似,所以我这里可能没有错。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 如果完成功能所需的时间有所不同,则应在云控制台中增加功能的timeout以符合期望。默认超时为60秒,显然在这里还不够长。

  2. 错误消息告诉您您过于频繁地写入单个文档。 Firestore的限制为1 write per second per document,并且最终将拒绝超过该限制的突发写入。计数器在Firestore中很困难,可以通过sharding your counter或使用其他某种机制来保留计数来解决。