我正在经历一个相同云功能的某些不稳定行为。这是场景:
我有一个文件,其中包含约223000个小型数据库记录(每个约512字节),我将它们分成JSON文件,每个记录有5000条记录,并通过iOS应用将其上传到Firebase Storage。
上传会触发云功能,该功能读取并解析JSON文件,将5000条记录分为10个包(每包500条记录),并使用批量写入将其发送到Firestore数据库。仅在成功完成先前的批量写入之后,才触发下一个批量写入。如果批量写入返回错误,则处理批量写入的承诺将失败。
每次成功批量写入后,还会通过事务更新文档以更新记录计数以及Firebase数据库中分支的更新。
我的应用程序将223000条记录正确地分为45个文件,并且也正确上传了。一个文件的大小约为2 MB。相应的云功能也会触发45次。 但是:
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)
数据库的“记录”非常相似,所以我这里可能没有错。
有什么想法吗?谢谢!
答案 0 :(得分:1)
如果完成功能所需的时间有所不同,则应在云控制台中增加功能的timeout以符合期望。默认超时为60秒,显然在这里还不够长。
错误消息告诉您您过于频繁地写入单个文档。 Firestore的限制为1 write per second per document,并且最终将拒绝超过该限制的突发写入。计数器在Firestore中很困难,可以通过sharding your counter或使用其他某种机制来保留计数来解决。