节点 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.
我所做的并且可以作为可能的错误来源丢弃:
- 使用相同的连接将随机内容插入 table。
我确定数据库服务器、连接没有问题。
问题必须在 Promise.all()
、await 后。
看起来每条记录都是通过单独调用 insertData
插入的。每次调用很可能包含网络延迟等开销,5000个请求不可能全部同时处理。对 insertData 的一次调用必须将数据发送到数据库并等待响应,在下一次调用甚至可以开始发送其数据之前。超过 10 分钟的 5000 个请求对应于每个请求 1.2 秒的延迟,如果数据库在另一台机器上,这不是不合理的。
更好的策略是在一个网络请求中插入所有对象。您应该修改 insertData
以允许它接受一组要插入的对象,而不是一次只插入一个。然后,所有数据都可以一次发送到数据库,而您只会遭受一次延迟。
我必须在每封电子邮件发送后插入一个 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.
我所做的并且可以作为可能的错误来源丢弃:
- 使用相同的连接将随机内容插入 table。
我确定数据库服务器、连接没有问题。
问题必须在 Promise.all()
、await 后。
看起来每条记录都是通过单独调用 insertData
插入的。每次调用很可能包含网络延迟等开销,5000个请求不可能全部同时处理。对 insertData 的一次调用必须将数据发送到数据库并等待响应,在下一次调用甚至可以开始发送其数据之前。超过 10 分钟的 5000 个请求对应于每个请求 1.2 秒的延迟,如果数据库在另一台机器上,这不是不合理的。
更好的策略是在一个网络请求中插入所有对象。您应该修改 insertData
以允许它接受一组要插入的对象,而不是一次只插入一个。然后,所有数据都可以一次发送到数据库,而您只会遭受一次延迟。