Использование параметра параллелизма Bluebird Promise.map для ускорения запроса на CouchDB - PullRequest
0 голосов
/ 03 апреля 2019

В одном из моих запросов я собираю ~ 250 вызовов для одного массива результатов, используя функцию Bluebird Promise.map. Каждый отдельный вызов занимает ~ 60 мсек, когда выполняется сам по себе, поэтому при параллелизме 10 я ожидаю, что результат основного запроса будет около 1.5sec (=(250/10)*60ms).

Но я получаю ответ в диапазоне ~ 15 секунд, как если бы каждый запрос выполнялся один за другим. Независимо от того, какое значение я придаю параметру параллелизма, я всегда получаю одинаковое (слишком длинное) время ответа.

Вот мой код (я использую модуль nano на сервере node.js):

console.time("total");
let concurrency = req.query.hasOwnProperty("concurrency") ? Number(req.query.concurrency) : 20;
console.time("list_dbs");
nano.db.list().then((body) => {
    console.timeEnd("list_dbs");
    let dbs = body.filter((db) => db.search(/^ts_[0-9]{4}-[0-9]{2}/g)>-1);
    console.log(dbs.length); //244
    console.time("Promises");
    Promise.map(
        dbs,
        (db_name) => {
            console.time(db_name);
            let db = nano.use(db_name);
            return db.view(
                "blah",
                "blah" ,
                {
                    group_level:1,
                    stale:"ok"
                }
            ).then((body) => {
                console.timeEnd(db_name);
                let blahs = [];
                body.rows.forEach((row) => {
                   blahs.push(row.key[0]);
                });
                return(blahs);
            }).catch((err) => {
                return err;
            });
        },
        {concurrency: concurrency}
    ).then((values) => {
        console.timeEnd("Promises");
        res.send((_.union(_.flatten(values))).sort());
        console.timeEnd("total");
    }).catch((err) => {
        res.send(err);
        console.timeEnd("total");
    });
}).catch((err) => {
    res.send(err);
    console.timeEnd("total");
});

Что-то не так с моим использованием Promise.map? Есть ли в кушетке параметр, который регулирует скорость? Как ускорить этот запрос?

...