【问题标题】:Run batch or transaction in Cloud Firestore onCreate trigger在 Cloud Firestore onCreate 触发器中运行批处理或事务
【发布时间】:2019-07-26 21:32:50
【问题描述】:

让我们想象一下,在 Firestore 中,我有一组供应商文档:

vendors : {
  vendor1: {
    id: "vendor1",
    name: "John",
    shopId: "shop1"
  },
  vendor2: {
    id: "vendor2",
    name: "Mary",
    shopId: "shop2"
  }
}

还有商店文件的集合:

shops : {
  shop1: {
    id: "shop1",
    name: "My Super shop - City A",
    vendors : {
      vendor1: {
        id: "vendor1",
        name: "John"
  },
  shop2: {
    id: "shop2",
    name: "My Super shop - City B",
    vendors : {
      vendor2: {
        id: "vendor2",
        name: "Mary"
  }
}

对于读取性能,每个商店文件都有其供应商的副本。我只复制我的视图中需要的供应商数据(移动应用程序),如果在供应商集合上启动了 onUpdate 触发器,我会更新商店文档上的供应商数据。

今天,我要做的是:

exports.updatesOnCreateVendor = functions
  .firestore.document("vendors/{vendorId}")
  .onCreate(async snapshot => {
    const vendor = snapshot.data();

    const { shopId } = vendor;

    const shopRef = db.collection("shops").doc(shopId);

    const shopAfter = {
      vendors: {}
    };

    shopAfter.vendors[vendorId] = { ...vendor };

    const batch = db.batch();

    batch.set(shopRef, shopAfter, { merge: true });

    return batch
           .commit()
           .then(console.log)
           .catch(console.error);
  });

如果云功能失败,我不想丢失此副本(并且我不想主动重试云功能)。 (更新的相同约束)。 阅读文档后,我得出结论,使用批处理或事务将保证如果在 25 次尝试后仍未成功,它将重试。

那么,我想知道在云函数触发器上使用批处理/事务是否是最佳实践?

如果我重构它并仅使用 shopRef.set(shopAfter, { merge: true }) 替换批处理,如果云功能失败,会发生什么? (我想我会丢失我的副本:p)

感谢您花时间帮助我更好地了解 Firebase :)

【问题讨论】:

  • 我不确定我是否理解您的顾虑。函数调用总是有可能失败。如果它的状态不能正确返回到 Cloud Functions,它也有可能会被重试。如果您担心某些事情可能会失败并且您不想丢失触发该函数的事件,那么您确实需要启用该函数的重试,并正确处理这些重试。
  • 很抱歉,如果它令人困惑。我只是想知道在这种情况下使用批处理是否太多:确保创建“触发器”确实写入了我的数据,即使某些事情使云功能失败(超时、网络问题等)。就像我理解文档一样,批处理似乎是独立运行的。是否认为无论哪个函数启动一个批次,它都会在后台继续提交,即使函数结束?

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


【解决方案1】:

这批货根本不会改变你的处境。一个文档的批量写入与一个文档的正常写入没有任何不同。批处理要做的就是确保所有文档写入原子发生,并且在完全相同的时刻生效。

【讨论】:

  • 假设批处理在您有 onCreate 触发器监视的集合上创建多个文档。批处理触发 onCreate 函数的次数与创建文档的次数一样多,还是只触发一次?新添加的文档如何获取到哪个cas?
猜你喜欢
  • 2018-04-04
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 2022-12-16
  • 2019-05-27
  • 2020-01-29
相关资源
最近更新 更多