【问题标题】:How to update 1 Million documents in Firestore?如何更新 Firestore 中的 100 万个文档?
【发布时间】:2020-06-10 01:23:22
【问题描述】:

为了方便阅读,我使用了反规范化。工作流程就是这样。

有两个集合

  1. 用户
  2. 活动

事件具有开始、结束时间戳和状态。 开始、结束时间戳指示事件何时开始和结束 状态保持,如果其即将到来或生活或完成或取消 通过收听每分钟调度程序来更新状态。

当用户注册一个事件时,我将事件对象复制到 users/{user-id}/events 下。这是必需的,因为我需要获取用户注册的事件。

问题

假设有 100 万用户订阅了状态为“即将到来”的事件。当状态从 Upcoming 变为 Live 时,我需要为所有用户更新 users/{user-id}/events 集合下的所有文档。

如果我进行顺序批量写入,则需要近 1000000/500 = 2000 批,并且需要近 15 到 30 分钟来更新一个事件更改。随着事件的增加,我认为问题太多了。

我非常担心每秒对整个 Firestore 进行 10,000 次更新以使用并行批量写入的限制。

如何处理这种情况,以便写入不会达到限制并且可以尽可能快地写入?

【问题讨论】:

  • 您知道这项手术的成本吗?
  • 是的。不幸的是,仅仅因为没有具有多个字段的查询功能(这里是开始和结束时间戳),我必须通过更新状态标志。我认为这是一个非常普遍的用例,但不确定其他人如何能够大规模解决它!
  • 云任务似乎只是一种解决方法,但更新这些文档仍然需要大量时间。到那时,在最坏的情况下,用户可能需要等待 15-30 分钟才能改变状态,这实际上是无法接受的。
  • 云任务允许您控制速率限制,但不能加速此操作。 Firestore/Datastore 不是为同时处理/更新多个文档而设计的,它对于每个事务处理一个或几个文档非常有效。
  • 没错!这就是我想出来的。您对这项工作有什么建议吗?喜欢并行使用其他数据库作为 Firestore 的助手?

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


【解决方案1】:

如果您知道处理写入的速度有多快,则可以使用 Cloud Tasks 来限制写入速率。完整的讨论可能超出了单个 Stack Overflow 答案的范围。在熟悉了Cloud Tasks 之后,我建议专门查看configuring a rate limit 以了解您将用于处理所有写入的队列。分派到队列的任务可以调用函数来执行删除。

【讨论】:

  • 我之前完成了云任务,但还不确定它如何解决,因为同样的写入限制也适用于此。此外,在后台写入的同时,还需要执行正常的数据库操作。但是,让我再试一次,看看云任务是否有帮助。谢谢道格!
  • Cloud Tasks 的限制与 Firestore 不同。 Cloud Tasks 将改为遵守 Firestore 的限制,只根据您选择的频率写入。
  • 哦!但是,我在这里遇到了障碍,因为我的事件可能在未来 30 天以上,这似乎是云任务的限制。
  • 我不知道为什么这很重要?只需在需要完成的工作之前,在支持的时间范围内安排工作。
  • 感谢您的来信。我正在使用 cron 在限制范围内进行调度。另外,如果我理解正确,我只是想确认您的第二条评论。考虑我使用一项任务来更新一个文档(更新到实时状态更新更改),当使用云任务时我不需要担心 firestore 写入限制?抱歉,如果您已经提到过,但我不确定它如何避免 10,000 写入/秒的限制。
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
相关资源
最近更新 更多