Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如果我使用Promise.all这样制作文档,我会达到每个数据库每秒的最大写入数吗?_Node.js_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Node.js 如果我使用Promise.all这样制作文档,我会达到每个数据库每秒的最大写入数吗?

Node.js 如果我使用Promise.all这样制作文档,我会达到每个数据库每秒的最大写入数吗?,node.js,firebase,google-cloud-firestore,google-cloud-functions,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,我现在正在开发一个应用程序。我想向我的收件箱中的所有用户发送一条消息。在我的云函数中,代码是这样的 const query = db.collection(`users`) .where("lastActivity","<=",now) .where("lastActivity",">=",la

我现在正在开发一个应用程序。我想向我的收件箱中的所有用户发送一条消息。在我的云函数中,代码是这样的

        const query = db.collection(`users`)
                        .where("lastActivity","<=",now)
                        .where("lastActivity",">=",last30Days)

        const usersQuerySnapshot = await query.get()

        const promises = []

        usersQuerySnapshot.docs.forEach( userSnapshot => {

            const user = userSnapshot.data()
            const userID = user.userID

            // set promise to create data in user inbox
            const p1 = db.doc(`users/${userID}/inbox/${notificationID}`).set(notificationData)
            promises.push(p1)
            
        })

        return await Promise.all(promises)
const query=db.collection(`users`)
.where(“lastActivity”,“=”,Last30天)
const usersQuerySnapshot=wait query.get()
常量承诺=[]
usersQuerySnapshot.docs.forEach(userSnapshot=>{
const user=userSnapshot.data()
const userID=user.userID
//设置在用户收件箱中创建数据的承诺
const p1=db.doc(`users/${userID}/inbox/${notificationID}`).set(notificationData)
承诺推送(p1)
})
返回等待承诺。全部(承诺)
Firebase中有一个限制:

每个数据库每秒最大写入数10000(每个数据库最多10 MiB (二)

假设我向25k用户发送消息(为25k用户创建文档)

的操作等待承诺多长时间。所有(承诺)
都将发生?我担心这个操作需要不到1秒的时间,我不知道它是否会达到那个极限或者不使用这个代码。我不确定这个手术的手术率


如果我达到了这个极限,如何在一段时间内分散它?你能给我一个线索吗?抱歉,我是新手。

您可以使用,例如,在一般情况下减少承诺并发,或者最好使用。

您可以使用,例如,在一般情况下减少承诺并发,或者最好使用。

如果您想限制文档写入的速度,您可能不应该盲目地在一个循环中开始大量的写操作。虽然无法保证它们会以多快的速度出现,但您可能会超过10K/秒/数据库限制(取决于客户端的网络连接有多好,以及Firestore通常的响应速度)。在移动或web客户端上,我怀疑您是否会超过限制,但在与Firestore数据库位于同一区域的后端上,谁知道呢,您必须对其进行基准测试

您的客户机代码可以简单地用一些简单的逻辑来控制自己,以测量其进度


如果你有很多文件要写得越快越好,并且你不想扼杀你的客户端代码,考虑使用队列将它们作为单独的工作项来节制。队列可以配置为管理任务队列的执行速率。这将大大增加执行所有这些写入操作所需的工作量,但应始终保持在安全范围内。

如果要限制文档写入的速度,可能不应盲目地在循环中启动大量写入操作。虽然无法保证它们会以多快的速度出现,但您可能会超过10K/秒/数据库限制(取决于客户端的网络连接有多好,以及Firestore通常的响应速度)。在移动或web客户端上,我怀疑您是否会超过限制,但在与Firestore数据库位于同一区域的后端上,谁知道呢,您必须对其进行基准测试

您的客户机代码可以简单地用一些简单的逻辑来控制自己,以测量其进度


如果你有很多文件要写得越快越好,并且你不想扼杀你的客户端代码,考虑使用队列将它们作为单独的工作项来节制。队列可以配置为管理任务队列的执行速率。这将大大增加执行所有这些写入操作所需的工作量,但应始终保持在安全范围内。

Promise.all将并行发出所有请求。这意味着您正试图同时向Firebase打开25000个TCP套接字。是的,您可能会达到限制-如果不是Firebase的限制,您甚至可能达到最大打开文件描述符的操作系统限制,在Linux上默认情况下,每个进程的最大打开文件描述符数通常只有1k(但您可以对此进行配置)@slebetman not true-Firestore将所有请求通过托管套接字传输。Promission只跟踪每个单独工作项的进度,而不考虑底层的并发性。Promission.all将并行发出所有请求。这意味着您正试图同时向Firebase打开25000个TCP套接字。是的,您可能会达到限制-如果不是Firebase的限制,您甚至可能达到最大打开文件描述符的操作系统限制,在Linux上默认情况下,每个进程的最大打开文件描述符数通常只有1k(但您可以对此进行配置)@slebetman not true-Firestore将所有请求通过托管套接字传输。承诺只是跟踪每项工作的进度,而不管底层并发性如何。批处理写入不会在规定的限制(每个数据库每秒写入10K次)下减慢文档写入的进度。批处理或事务中的每个文档都是单独计算的。当然可以,但它仍然更易于控制,而且更高效。对于节流来说,控制并不容易。你仍然需要弄清楚什么时候这个频率太高,然后睡一会儿,这样才能退下来。此外,批处理写入要么全写,要么全写,如果每次写入在逻辑上彼此独立,这可能不太合适。使用异步try/catch,这仍然是一个非常简单的while循环。是的,在这两种情况下都是同样困难的。批处理写入不会在规定的限制下减慢文档写入的进度(每个数据库每秒写入10K次)。批处理或事务中的每个文档都是单独计算的。当然,但它仍然更易于控制,而且效率更高。对于节流而言,控制并不容易。您仍然需要找出速率过大的时间,然后休眠一段时间以便后退。此外,批处理写入是全部或无,这可能不太可能如果每个wr