我在Python 3.7中具有Cloud Function来将小文档写入/更新到Firestore。每个文档都有一个user_id作为Document_id,还有两个字段:时间戳和带有三个键值对象的地图(词典),它们都很小。
这是我用来编写/更新Firestore的代码:
doc_ref = db.collection(u'my_collection').document(user['user_id'])
date_last_seen=datetime.combine(date_last_seen, datetime.min.time())
doc_ref.set({u'map_field': map_value, u'date_last_seen': date_last_seen})
我的目标是每天调用一次此功能,并编写/更新约500K个文档。我尝试了以下测试,每一项都包含执行时间:
测试A:将输出处理为1000个文档。不要编写/更新Firestore->〜2秒
测试B:将输出处理为1000个文档。写入/更新Firestore->〜1分3秒
Test C:将输出处理为5000个文档。不要编写/更新Firestore->〜3秒
测试D:将输出处理为5000个文档。写入/更新Firestore->〜3分12秒
我的结论是:编写/更新Firestore消耗了我99%以上的计算时间。
问题:如何每天有效地编写/更新〜500 K文档?
较高的读写率和较小的文档范围内的删除率[避免在字典上关闭文档时具有较高的读写率,否则您的应用程序将遇到争用错误。这个问题是称为热点,您的应用程序可能会遇到热点是否执行以下任何操作:
以很高的速度创建新文档,并分配自己单调递增的ID。
Cloud Firestore使用分散算法分配文档ID。如果您创建新的,则不应在写入时遇到热点使用自动文档ID的文档。
在文件很少的集合中高速创建新文件。
以非常高的速率创建具有单调递增字段(如时间戳)的新文档。
高速删除集合中的文档。
以极高的速率写入数据库,而不会逐渐增加流量。
注意:对于批量数据输入,请使用带有并行化单个写入。批量写入的性能优于序列化写入,但不比并行写入好。你应该用服务器客户端库,用于批量数据操作,而不是移动/网络SDK。
我还建议使用Node.js中的示例查看stackoverflow中的this帖子