云功能中的批量写入或事务处理?

时间:2019-06-18 06:42:55

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

我具有以下 Cloud Function ,并想知道我应该使用批量写入还是事务:

const firestore = admin.firestore()
// The following two queries potentially return hundreds of documents.
const queryA = firestore.collectionGroup('a').where('b', '==', 'c'),
  queryB = firestore.collection('b').where('b', '==', 'c')

const snapshotA = await queryA.get(), snapshotB = await queryB.get()
const batch = firestore.batch()
for (const documentSnapshot of snapshotA.docs.concat(snapshotB.docs)) {
  batch.update(documentSnapshot.ref, { 'b': 'd' })
}
return batch.commit()

我确实要求此操作必须永不失败,但是,我看不到任何这种操作都会失败的情况。

在这种情况下,是否有任何理由使用交易
相反,是否有任何理由不使用此处的交易?

1 个答案:

答案 0 :(得分:1)

您只需到Firestore(而不是读取),因此乍一看,无需使用事务,因为“当您想更新字段的值时,事务很有用根据其当前值或其他字段的值”(请参见doc),则应使用批量写入。

但是,您应该注意“每笔交易或批量写入最多可以写入500个文档”(请参阅​​同一文档)。由于您提到查询“可能返回数百个文档”,因此您在这里可能会遇到问题,必须分几批编写。


其他要点:您说:“我确实要求此操作必须永不失败,但是我看不到任何可能会失败的情况”。您无法确定它会 永远不会 失败:如文档中所述,Cloud Function“可能由于内部错误而过早退出”(有关更多详细信息,请参见以下要点) )。例如,Cloud Function平台和Firestore 1之间可能存在连接问题,并且批量写入失败(与代码无关)。

要满足此要求(即“我确实要求此操作永不失败”),您应该利用重试后台Cloud Function 的可能性以及批处理的事实的写入原子完成。有关后台云功能重试的信息,请参阅以下doc,它说明:

  1. 为什么会发生这种情况(“在极少数情况下,由于内部错误,功能可能会过早退出,默认情况下,该功能可能会自动重试,也可能不会自动重试”,并且
  2. 如何处理这种情况(用两个词来说,启用重试并使背景Cloud Functions成为幂等)。