Параллелизм обещания Bluebird в операциях миграции коллекции dong монго - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над сценарием, в котором мне нужно взять данные из коллекции mongodb, обработать их с помощью некоторых переименований и сопоставлений и поместить данные в другую коллекцию.Я использую этот скрипт в expressjs с нативным клиентом mongodb для nodejs.

Вот мой скрипт со всеми запущенными функциями

const syncCustomerWithCustomerv1 = function(params){
    utils.connectDB().then((client) => {
        Promise.map(aggregateDocumentsv1(client, params), function(cursor){
            Promise.map(getCustomerDatav1(cursor), function(customer){

                var hashedMap = makeHashedObjectv1(customer);
                makeDatav1(client, customer, hashedMap).then((response)=> {
                    console.log("success");
                }).catch((error) => {
                    console.log(error);
                    reject(error);
                })
            }, {concurrency: 500});
        }, {concurrency: 500}).then((reponse) => {  
            console.log("data inserted");
        })
    }).catch((error) => {
        console.log(error);
    });
}

Теперь в функции с именем syncCustomerWithCustomerv1 я могу получитьданные из старой коллекции в новую коллекцию, но я не думаю, что какие-либо параллельные запросы принимаются в этом.в то время как вышеуказанная операция выполняется, я не могу нажать api, поэтому при выполнении операции она не позволяет другим запросам выполняться.

  • в файле Promise.map (aggregateDocumentsv1)), Я беру список курсоров.каждый элемент в массиве listOfCursor имеет курсор, который при запросе дает 500 записей.

  • Я ожидаю, что он получает каждый курсор и назначает его следующему Promise.map (getCustomerDatav1 (cursor)),Теперь это приводит к каждому клиенту, который у меня есть в моей предыдущей коллекции монго, и мы можем выполнить операции сопоставления с полученным объектом, а затем вставить данные в новую коллекцию.

Если кто-то получитпроблема и знаю, как я могу сделать его более параллельным, чтобы я мог запустить этот скрипт, а также мои API также не получали простоев.

1 Ответ

0 голосов
/ 04 марта 2019

Я не знаю о MongoDB, но есть несколько проблем с вашим кодом обещания:

  • Для любой функции (будь то Promise.map или then) можно ожидатьдля результата асинхронного обратного вызова этот обратный вызов должен return обещание, которое следует ожидать
  • Вы выполняете 500 одновременных операций, где каждая из этих операций выполняет 500 одновременных операций.Это общий коэффициент параллелизма 250000!Вы, вероятно, хотите немного уменьшить это.

function syncCustomerWithCustomerv1(params){
    utils.connectDB().then(client => {
        return Promise.map(aggregateDocumentsv1(client, params), cursor => {
//      ^^^^^^
            return Promise.map(getCustomerDatav1(cursor), customer => {
//          ^^^^^^
                var hashedMap = makeHashedObjectv1(customer);
                return makeDatav1(client, customer, hashedMap).then(response => {
//              ^^^^^^
                    console.log("success");
                }, error => {
                    console.log(error);
                });
            }, {concurrency: 500});
        }, {concurrency: 500})
    }).then(reponse => {  
        console.log("data inserted");
    }, error => {
        console.log(error);
    });
}
...