【问题标题】:Best ways to delete a big amount of docs in scheduled cloud functions在预定的云功能中删除大量文档的最佳方法
【发布时间】:2021-02-10 18:18:11
【问题描述】:

我正在处理一个每 5 分钟执行计划的云功能的用例。此函数使用 2GB 内存和 256 秒超时运行,将查询集合,尝试搜索过期文档。

由于删除文档的成功至关重要,我担心大量文档可能会出现错误...我看过批量删除在大多数情况下是解决这个问题的关键,但是,如果其中一个删除失败,则会忽略大量删除

目前,我正在这样做:

 await allSettled(
    querySnapshot.docs.map((doc) => {
        ...

        // Create a batched write
        const batch = firestore.batch();

        // Delete the doc
        batch.delete(doc.ref);

        // Decrease doc owner counter
        batch.set(
          ...
        );

        return batch.commit();
      })
      .then(() => { ... })
      .catch(() => { ... });

 ............................

 exports.allSettled = function (promises) {
  let wrappedPromises = promises.map((p) =>
    Promise.resolve(p).then(
      (val) => ({ status: "fulfilled", value: val }),
      (err) => ({ status: "rejected", reason: err })
    )
  );

  return Promise.all(wrappedPromises);
};

如您所见,我不是批量删除“常规”文档,而是映射文档列表,并且对于每个文档,在独立的批量操作中,我将其删除并减少一个计数器。

推荐使用哪种方法从集合中删除大量文档(以避免内存不足错误等)?

【问题讨论】:

    标签: node.js google-cloud-firestore google-cloud-functions


    【解决方案1】:

    你认为是否有可能在第一个云函数中获取要删除的文档列表(在调度程序上每 N 分钟运行一次),然后将该列表分成 M 个不重叠的块,并推送 M 个消息(一个“块”每条消息)进入一些 PubSub 主题。在主题的另一边,还有另一个由 PubSub 消息触发的云功能(具有最大实例数)。该云功能可以通过传入的文档列表(类似于您提供的代码)来执行删除。在这种情况下,这些删除可能或多或少并行进行。

    如果某些内容没有被删除 - 它只会被下一个计划的“作业”拾取。

    你认为它在你的环境中有用吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 2021-02-13
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多