Firebase 如何在Firestore中高效地每天编写约500K文档?

Firebase 如何在Firestore中高效地每天编写约500K文档?,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我在Python3.7中有一个云函数,用于将小文档写入/更新到Firestore。每个文档都有一个用户id作为文档id,还有两个字段:一个时间戳和一个带有三个键值对象的映射(一个字典),它们都非常小 这是我用来编写/更新Firestore的代码: doc_ref = db.collection(u'my_collection').document(user['user_id']) date_last_seen=datetime.combine(date_last_seen, da

我在Python3.7中有一个云函数,用于将小文档写入/更新到Firestore。每个文档都有一个用户id作为文档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秒

测试C:将输出处理为5000个文档。不写入/更新Firestore->3秒

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

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


问题:如何每天高效地编写/更新~500K文档?

如果不知道您实际试图编写的数据的详细信息,就不可能制定单一的行动方案。我强烈建议您阅读有关的文档。它将让您了解可以做些什么来避免写负载过大的问题

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

较高的读取、写入和删除速率,可缩小文档范围

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

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

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

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

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

  • 以高速率删除集合中的文档

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


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

如果不知道您实际试图编写的数据的详细信息,就不可能制定单一的行动方案。我强烈建议您阅读有关的文档。它将让您了解可以做些什么来避免写负载过大的问题

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

较高的读取、写入和删除速率,可缩小文档范围

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

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

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

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

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

  • 以高速率删除集合中的文档

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


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

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

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


我还建议大家看看stackoverflow中的文章,其中有Node.js中的示例。我通过批处理查询实现了我的需求。但根据研究,还有另一种更快的方法:

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


我还建议查看一下stackoverflow中的post,其中有Node.js中的示例

假设我遵循“ramping up”建议,每5分钟使用公式previous_writes+previous_writes*0.5缩放写入次数。2小时后,Firebase准备扩展到500K写入。当我的职能部门再次尝试写入/更新500K文档时,明天会发生什么?Firestore会很快吗?只要你能保持这样的写入速度。假设