用于大型集合的Nodejs Bluebird Promise.map不起作用



我有一个拥有20000多个Promise的大型集合,我想使用Bluebird的Promise.map来解决它。然而,我的代码没有成功执行,但在大约15-20分钟后超时。

我得到的错误是超时错误。

当集合的promise少于2000个时,代码将在不到10秒内成功执行。

请帮助我找到Promise.map的替代方案或任何其他方式,以便代码不会超时。

service.getSomePromises().then(function(arrSomePromises){
var promises = []; 
for (var i = 0;i < arrSomePromises.length; i++){
var getDetailsObject = _getDetails(_db, i);
promises.push(getDetailsObject);
}
//Below is the code that times out
return Promise.map(promises, function(doc){
return reportData.push(doc);
})
}

如果您遇到超时错误,那么您可能只是用对某个主机的太多同时请求淹没了目标服务器。对于大量请求,您需要限制在同一时间向同一主机发送的同时请求的数量。我建议从一次大约5-10的限制开始,然后你可以尝试提高它,看看这是否真的能提高你的表现。目标服务器有一个限制,可以同时有效地同时服务所有请求的数量。高于此值只会给基础架构带来负担,最终只会导致超时错误。

Bluebird的Promise.map()在正确使用时(您没有这样做)有一个concurrency选项,它会告诉它您希望它一次使用的最大并发连接数。但是,要使用该选项,您必须正确使用Bluebird.map(),向它传递一个数据数组(而不是已经启动异步操作的promise数组)和一个返回对其中一个数据项进行操作的promise。

以下是如何将Promise.map()concurrency选项一起正确使用的示例。

let someLargeArrayOfData = [...];
Promise.map(someLargeArrayOfData, function(item) {
return request(item);     // async function that returns promise
}, {concurrency: 10}).then(function(results) {
// results is an array of data from all the resolved promises
}).catch(function(err) {
// process error here
});

最新更新