【发布时间】: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