删除操作的 Firebase 实时数据库限制
Firebase realtime database limit for delete operations
我是一名 firebase 用户,最近深入研究了 rtdb,刚刚发现一个限制 docs 解释单个数据库实例的写入限制,引述如下:
The limit on write operations per second on a single database. While not a hard limit, if you sustain more than 1,000 writes per second, your write activity may be rate-limited.
例如在firestore的安全规则中,删除操作属于写操作的范畴,我想这个概念也适用于其他firebase服务。所以我想确切地知道 delete operation
是否受 rtdb 实例的写入限制。
仅供参考,我计划使用具有云功能的最新节点 js admin sdk 来操作大量删除,使用 this link 的方法来处理大量不同的路径。
因此,如果删除操作受制于 rtdb 写入操作,部署此功能似乎是一个严重的错误,即使只有少数用户可能同时触发此功能。考虑到 firebase admin sdk 非常擅长快速迭代这些操作,即使很少并发调用也会很快超过每秒写入限制。
由于每次删除都要指定path的id(key)(-这样就不会无意中删除嵌套的数据),单纯删除parent path不适用于这种情况,甚至很危险..
如果删除操作不受写限制,那么我也想知道rtdb是否真的没有删除操作的单一限制!!希望社区中的 firebase 专家能回答这个问题!欢迎评论和赞赏!提前谢谢你 [:
删除操作算作写入操作。如果您 运行 20K 次删除操作,即同时使用 Promise.all()
进行 20K 次单独的 .remove()
操作,它们都将被视为唯一操作,并且您将受到速率限制。那些超过限制的额外删除请求需要时间才能成功。
相反,如果您使用的是 Cloud 函数,则可以创建一个包含所有要删除的路径的对象,然后使用 update()
在 单次写入操作中删除所有这些节点.假设您有一个根节点 users
,每个用户节点都有一个 points
节点,您希望将其从所有用户中删除。
const remObject = {
"user_id_1/points": null,
"user_id_2/points": null
}
await admin.database().ref("users").update(remObject)
尽管您需要知道所有用户的 ID,这将在一次操作中从所有用户中删除 points
节点,因此您不会受到速率限制。这样做的另一个好处是所有这些节点肯定会被删除,这与执行个别请求不同,其中一些请求可能会失败。
如果您为每个用户 运行 不同的 `remove()` 操作,如下所示,那么它将计为 N 次写入,其中 N 是操作数。
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
我 运行 一些带有上述代码的测试函数,毫不奇怪,使用 Promise.all()
的不同操作添加和删除 20K 节点花费了 40 多秒,而对对象使用单个更新操作仅花费了3.
请注意,使用单一更新方法可能会受到 "Size of a single write request to the database"
的限制,SDK 为 16 MB,REST 为 256 MB API。在这种情况下,您可能必须将对象分解成更小的部分并使用多个 update()
操作。
我是一名 firebase 用户,最近深入研究了 rtdb,刚刚发现一个限制 docs 解释单个数据库实例的写入限制,引述如下:
The limit on write operations per second on a single database. While not a hard limit, if you sustain more than 1,000 writes per second, your write activity may be rate-limited.
例如在firestore的安全规则中,删除操作属于写操作的范畴,我想这个概念也适用于其他firebase服务。所以我想确切地知道 delete operation
是否受 rtdb 实例的写入限制。
仅供参考,我计划使用具有云功能的最新节点 js admin sdk 来操作大量删除,使用 this link 的方法来处理大量不同的路径。
因此,如果删除操作受制于 rtdb 写入操作,部署此功能似乎是一个严重的错误,即使只有少数用户可能同时触发此功能。考虑到 firebase admin sdk 非常擅长快速迭代这些操作,即使很少并发调用也会很快超过每秒写入限制。
由于每次删除都要指定path的id(key)(-这样就不会无意中删除嵌套的数据),单纯删除parent path不适用于这种情况,甚至很危险..
如果删除操作不受写限制,那么我也想知道rtdb是否真的没有删除操作的单一限制!!希望社区中的 firebase 专家能回答这个问题!欢迎评论和赞赏!提前谢谢你 [:
删除操作算作写入操作。如果您 运行 20K 次删除操作,即同时使用 Promise.all()
进行 20K 次单独的 .remove()
操作,它们都将被视为唯一操作,并且您将受到速率限制。那些超过限制的额外删除请求需要时间才能成功。
相反,如果您使用的是 Cloud 函数,则可以创建一个包含所有要删除的路径的对象,然后使用 update()
在 单次写入操作中删除所有这些节点.假设您有一个根节点 users
,每个用户节点都有一个 points
节点,您希望将其从所有用户中删除。
const remObject = {
"user_id_1/points": null,
"user_id_2/points": null
}
await admin.database().ref("users").update(remObject)
尽管您需要知道所有用户的 ID,这将在一次操作中从所有用户中删除 points
节点,因此您不会受到速率限制。这样做的另一个好处是所有这些节点肯定会被删除,这与执行个别请求不同,其中一些请求可能会失败。
如果您为每个用户 运行 不同的 `remove()` 操作,如下所示,那么它将计为 N 次写入,其中 N 是操作数。
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
我 运行 一些带有上述代码的测试函数,毫不奇怪,使用 Promise.all()
的不同操作添加和删除 20K 节点花费了 40 多秒,而对对象使用单个更新操作仅花费了3.
请注意,使用单一更新方法可能会受到 "Size of a single write request to the database"
的限制,SDK 为 16 MB,REST 为 256 MB API。在这种情况下,您可能必须将对象分解成更小的部分并使用多个 update()
操作。