节点 Promises.all() 执行时间过长

Node Promises.all() takes too long to execute

我必须在每封电子邮件发送后插入一个 table,其中包含有关已发送电子邮件的数据。

在一个循环中,我正在填充一个要由 Promise.all() 求解的数组。 insertData 是一个插入数据的函数,给定两个参数,connector,连接池和 dataToInsert,一个包含要插入数据的对象。

async function sendAndInsert(payload) {
  for (data of payload) {    
    let array = [];
   
    const dataToInsert = {
      id: data.id,
      campaign: data.campaign,
    }

    for (email of data) {
      array.push(insertData(connector, dataToInsert));
   }        
    await Promise.all(array);
  }

}

之后调用函数:

async invoke () {
  await sendAndInsert(toInsertdata);
}

要插入 5000 条记录,大约需要 10 分钟,这太疯狂了。

正在使用

nodejs v10

pg-txclient as DB connector to PostgreSql.

我所做的并且可以作为可能的错误来源丢弃:

  1. 使用相同的连接将随机内容插入 table。

我确定数据库服务器、连接没有问题。 问题必须在 Promise.all()await 后。

看起来每条记录都是通过单独调用 insertData 插入的。每次调用很可能包含网络延迟等开销,5000个请求不可能全部同时处理。对 insertData 的一次调用必须将数据发送到数据库并等待响应,在下一次调用甚至可以开始发送其数据之前。超过 10 分钟的 5000 个请求对应于每个请求 1.2 秒的延迟,如果数据库在另一台机器上,这不是不合理的。

更好的策略是在一个网络请求中插入所有对象。您应该修改 insertData 以允许它接受一组要插入的对象,而不是一次只插入一个。然后,所有数据都可以一次发送到数据库,而您只会遭受一次延迟。