如何在Firestore中每天有效地编写约50万个文档?

问题描述 投票:0回答:2

我在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文档?

firebase google-cloud-firestore google-cloud-functions
2个回答
1
投票
基本上,您将希望避免这些情况,如该文档中所述:

较高的读写率和较小的文档范围内的删除率

[避免在字典上关闭文档时具有较高的读写率,否则您的应用程序将遇到争用错误。这个问题是称为热点,您的应用程序可能会遇到热点是否执行以下任何操作:

    以很高的速度创建新文档,并分配自己单调递增的ID。
  • Cloud Firestore使用分散算法分配文档ID。如果您创建新的,则不应在写入时遇到热点使用自动文档ID的文档。

  • 在文件很少的集合中高速创建新文件。

  • 以非常高的速率创建具有单调递增字段(如时间戳)的新文档。

  • 高速删除集合中的文档。

  • 以极高的速率写入数据库,而不会逐渐增加流量。

  • 我不会重复该文档中的所有建议。您需要知道的是:由于Firestore的构建方式可以大规模扩展,因此限制了您可以向其中写入数据的速度。您必须逐步扩大规模这一事实可能将成为您无法解决的主要问题。

  • 0
    投票

    注意:对于批量数据输入,请使用带有并行化单个写入。批量写入的性能优于序列化写入,但不比并行写入好。你应该用服务器客户端库,用于批量数据操作,而不是移动/网络SDK。

    我还建议使用Node.js中的示例查看stackoverflow中的this帖子
    © www.soinside.com 2019 - 2024. All rights reserved.