我计划在firebase上运行大量查询,这可能会增长到几十万甚至数百万。我一直在使用Promise.all()
来解决我的大部分查询,但是随着请求的增长Promise.all()
似乎只是停止以随机数运行。我曾考虑使用Promise.map()
,但不确定是否并发将解决问题。谢谢您的帮助。
下面是一个简化的示例,您可以看到它似乎超时而不会引发任何错误:
var promises = [];
var i = 0;
for(var x = 0; x<1000000; x++){
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
i += 1;
resolve(i);
}, 10);
});
promises.push(promise);
}
Promise.all(promises).then((value) => {
console.log(value)
}).catch((error) => {
console.log("Error making js node work:" + error);
})
答案 0 :(得分:3)
当我需要执行类似操作时,通常将查询分为几批。批处理是一对一运行的,但是每个批处理中的查询是并行运行的。这就是可能的样子。
const _ = require('lodash');
async function runAllQueries(queries) {
const batches = _.chunk(queries, BATCH_SIZE);
const results = [];
while (batches.length) {
const batch = batches.shift();
const result = await Promises.all(batch.map(runQuery));
results.push(result)
}
return _.flatten(results);
}
您在此处看到的内容类似于map-reduce。也就是说,如果您在单个节点(例如,单个进程或虚拟机)中运行大量查询,则可以考虑在多个节点之间分布查询。如果查询的数量很大,并且查询的处理顺序并不重要,那么这很容易。您还应该确保下游系统(即您要查询的系统)可以处理您向其施加的负载。