Правильный способ использования MongoDB node.js `insertMany`, чтобы он не блокировал - PullRequest
0 голосов
/ 05 июля 2019

В приложении node.js я хотел использовать insertMany для вставки большого количества документов (ну, на самом деле, около 10 000).Я столкнулся со следующей проблемой: во время работы insertMany (вызывается с await) процесс node.js не обрабатывает ничего из цикла обработки, пока не завершится вызов insertMany.

Этоожидаемое поведение?Как бы я поступил так «правильно», чтобы мой сервис продолжал обрабатывать запросы?Я бы ожидал, что await insertMany автоматически включит это, поскольку это асинхронно, но, похоже, это не так.

Фрагмент кода:

exports.writeOrg = async (req, res, next) => {
  logger.debug('orgs.writeOrg()');
  // ...
  try {
    // ...
    logger.debug('Starting processing of data.');
    const newOrgDocs = await processLdapUsers(tenantId, ldapUsers);
    logger.debug('Processing of data finished.');

    const orgModel = getOrgModel(tenantId);
    // Now delete the entire collection
    logger.debug(`Delete entire org collection in tenant ${tenantId}`);
    await orgModel.deleteMany({});
    // And add the new org information; this replaces what was there before
    logger.debug(`Inserting org structure to tenant ${tenantId}`);
    // This is the call which seems to block: --->
    await orgModel.insertMany(newOrgDocs);
    // <---
    logger.debug(`Finished inserting org structure to tenant ${tenantId}`);
    // ...
  } catch (err) {
    // ...
    // error handling
  }
}

Функция writeOrgобработчик регулярных экспресс-запросов;полезная нагрузка представляет собой массив JSON с обычно 1000-20000 записями;в тестовом примере у меня 6000 записей с общим размером JSON около 6 МБ.Локальная запись занимает всего около 1,5 с, запись в MongoDB Atlas (самый дешевый уровень для тестирования) занимает около 20 секунд, и именно тогда возникает эта проблема.

Обходной путь : если я разделю данныев меньшие порции, например, 50 записей одновременно, цикл обработки событий время от времени обрабатывает некоторые данные для других запросов.Но все же, поскольку функция insertMany является вызовом функции async, я не ожидал, что это будет необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...