【问题标题】:How to write ~500 K documents every day efficiently in Firestore?如何在 Firestore 中高效地每天编写约 50 万份文档?
【发布时间】:2020-04-20 16:37:35
【问题描述】:

我在 Python 3.7 中有一个云函数,可以将小文档写入/更新到 Firestore。每个文档都有一个 user_id 作为 Document_id,还有两个字段:一个时间戳和一个包含三个 key-value 对象的 map(字典),它们都非常小。

这是我用来编写/更新 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 秒

Test D:将输出处理为 5000 个文档。写入/更新 Firestore -> ~ 3 分 12 秒

我的结论是:编写/更新 Firestore 占用了我 99% 以上的计算时间。

问题:如何高效地每天编写/更新约 50 万份文档?

【问题讨论】:

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


    【解决方案1】:

    在不了解您实际尝试写入的数据的详细信息的情况下,不可能制定单一的行动方案。我强烈建议您阅读有关best practices for Firestore 的文档。它将让您了解可以采取哪些措施来避免写负载过重的问题。

    基本上,您会希望避免这些情况,如该文档中所述:

    对狭窄文档范围的高读取、写入和删除率

    避免按字典顺序关闭文档的高读写率, 否则您的应用程序将遇到争用错误。这个问题是 称为热点,您的应用程序可能会遇到热点 如果它执行以下任何一项:

    • 以非常高的速度创建新文档并分配自己的单调递增 ID。

    • Cloud Firestore 使用分散算法分配文档 ID。如果您创建新的,则不应在写入时遇到热点 使用自动文档 ID 的文档。

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

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

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

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

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

    【讨论】:

    • 假设我遵循“加速”建议,每 5 分钟缩放一次写入次数,每次使用公式 previous_writes+previous_writes*0.5。假设 2 小时后,Firebase 已准备好扩展到 500K 写入。当我的函数将尝试再次写入/更新 500K 文档时,预计明天会发生什么? Firestore 会很快吗?
    • 仅当您维持该写入速率时。
    【解决方案2】:

    我通过批量查询实现了我的需求。但是根据Firestore documentation,还有另一种更快的方法:

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

    我还建议查看 this 在 stackoverflow 中的帖子以及 Node.js 中的示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多