Firebase实时数据库删除操作的限制

3
我是一个Firebase用户,最近开始使用rtdb,并发现有一个文档解释了单个数据库实例的写入限制,如下所示:

每秒针对单个数据库执行的写操作的限制。虽然不是硬性限制,但如果您维持每秒超过1,000次的写操作,则可能会对您的写活动进行速率限制。

例如,在firestore的安全规则中,删除操作属于写操作范畴,我猜这样的概念适用于其他Firebase服务。所以我想确切地知道,delete operation 是否受到 rtdb 实例的写入限制。
值得一提的是,我计划使用最新的node.js管理员SDK与云函数一起执行大量删除操作,使用此链接中的方法来处理许多不同路径的操作。
因此,如果删除操作受到 rtdb 的写入限制,即使仅有很少数量的用户可能同时触发此功能,部署此函数似乎也是一个重大错误。考虑到Firebase管理员SDK能够非常快速地迭代这些操作,即使只有几个并发调用,也很快就可以达到每秒写入限制。
由于我必须为每个删除操作指定路径的ID(键)(以便不会意外删除嵌套数据),因此仅删除父路径在这种情况下不可行,甚至非常危险。
如果删除操作不受写入限制,则我还想知道是否真的没有 rtdb 的单个删除操作限制!!希望这个问题能够引起Firebase社区中的专家们的关注!欢迎并感谢您的评论!谢谢您的支持。[:]

2
我通常使用 set(null),在任何其他限制之前,我得到的限制是您分享的链接上可以找到的“1000个云函数”限制。我不得不关闭 strictTriggerValidation 才能让它们工作。分批删除是使任何删除可扩展的最佳解决方案。 - Tarik Huber
@TarikHuber 感谢您的评论!就可扩展性而言,这也是一个重要的问题。在这种情况下,我认为Dharmaraj的回答更合适。[:] - tsitixe
2
我喜欢他的回答 :) 这就是为什么我刚才留了一个评论。 - Tarik Huber
1个回答

3

删除操作也算作写入操作。如果您运行20K个删除操作,即使用Promise.all()同时进行20K个不同的.remove()操作,它们都将被视为独立操作,并且会受到速率限制。超过限制的额外删除请求需要一些时间才能成功。

相反,如果您使用云函数,则可以创建一个包含要删除路径的所有对象,并使用update()单个写入操作中删除所有这些节点。假设您有一个根节点users和每个用户节点都有一个points节点,并且您想从所有用户中删除它。

const remObject = {
  "user_id_1/points": null,
  "user_id_2/points": null
}

await admin.database().ref("users").update(remObject)

虽然你需要知道所有用户的ID,但这将在单个操作中从所有用户中删除points节点,因此您不会被速率限制。另一个好处是,所有这些节点都将被确保删除,而不像执行单个请求时可能会出现某些请求失败的情况。


const userIDs = []

const removeRequests = userIDs.map(u => admin.database().ref(`users/${u}/points`).remove())

await Promise.all(removeRequests)
// userIDs.length writes which will count towards that rate limit

我对以上代码运行了一些测试函数,不出意外,使用独立的添加和删除20K个节点的操作,即使使用Promise.all()也需要超过40秒的时间,而只使用一个对象的单个更新操作仅需3秒。


请注意,使用单个更新方法可能会受到数据库写请求大小(SDK为16MB,REST API为256MB)的限制。在这种情况下,您可能需要将对象分解成较小的部分,并使用多个update()操作。


1
这正是我现在需要的。超级棒的想法,我在文档中也找到了传递 null 的想法。非常感谢!顺便说一句,操作时间也很令人印象深刻 [: - tsitixe
1
@tsitixe 注意,使用map方法可能会受到“数据库单个写入请求的大小”的影响,SDK为16 MB,REST API为256 MB。在这种情况下,您可能需要将地图分成较小的部分,并使用多个删除操作。已更新答案 :) - Dharmaraj
2
@Dharmaraj:你的第一个例子实际上会删除整个user_id_1user_id_2节点。如果只想删除points属性,请在键中使用路径:remObject = { "user_id_1/points": null, "user_id_2/points": null } - Frank van Puffelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接