Кластерный или порождающий процесс для каждой записи mongoDB - PullRequest
0 голосов
/ 22 апреля 2020

Я сейчас занят написанием NodeJS приложения, которое очищает несколько магазинов Shopify. Для этого я создал основной файл. js, в котором я получаю все текущие хранилища из MongoDB и через них l oop. Для каждого элемента я запускаю класс new Store, например:

const stores = await this.client.db.getAllShopifyStores();
if (stores.length > 0) {
  // read proxies file
  const text = fs.readFileSync(process.cwd() + '/proxy.txt', 'utf-8');
  const proxies =
    text == '' ? [] : proxyFunctions.formatProxy(text.replace(/\r/g, '').trim().split('\n'));

  console.log(`Loaded ${proxies.length} proxies!`);
  for (let i = 0; i < stores.length; i++) {
    this.stores.push(new Store(this.client, stores[i], proxies));
    this.stores[i].start();
  }
} else {
  this.client.logger.log(`No stores found, stopping shopify monitor`, 'warn');
  this.stop();
}

В каждом магазине есть функция, которая получает продукт из файла JSON, расположенного в этих магазинах, в большинстве случаев store.com/products.json, каждые несколько минут, используя простой asyn c setIntervalAsync. После получения этого файла JSON я обрабатываю все продукты, сопоставляя их с новым массивом и используя Promise.all. Basi c пример:

this.timer = setIntervalAsync(
  (f = async () => {
    // choose a random proxies per account
    const randomProxy = proxyFunctions.getRandomProxy(this.proxies);
    // store initial result
    const result = await scrapingFunction.scrapeProducts(this.store, randomProxy);
    // check for result
    if (result) {
      let promises = [];
      result.map((product) => {
        promises.push(this.handleProduct(product, this.store));
      });
      Promise.all(promises).then((response) => {});
      this.postsResult = true;
    } else if (!result) {
      await this.restart();
    }
    this.intervalCount++;
  }),
  2500
);

Функция handleProduct просматривает файл JSON и обрабатывает каждый продукт (в основном около 30 или около того), сравнивая значения со значениями в моей БД, и если что-то изменилось, сохраните продукт и сообщите мне через веб-крючок. Весь этот процесс занимает довольно много времени для каждого магазина.

До сих пор я заставлял приложение работать хорошо, но когда я добавил около 4 или около того магазинов в моей базе данных, сценарию не хватило бы памяти , Это уже проблема, потому что в будущем мне нужно будет добавить более 100 магазинов. Из-за этого я думал о кластеризации своего приложения. Я думал о том, чтобы у меня был отдельный процесс для каждого магазина в моей базе данных. Таким образом, у каждого магазина будут свои собственные ресурсы, что не приведет к сбою основного приложения, но я не уверен, насколько это действительно возможно.

Проблема в том, что я понятия не имею, что использовать для этого в Узел. Я нашел информацию о модуле кластера, но, похоже, использование этого показало бы проблему с моим подключением к базе данных (необходимо повторно инициализировать мою базу данных для каждого процесса). Я также пытался использовать рабочих и тому подобное.

Я просмотрел весь inte rnet, пытаясь найти хорошее руководство / решение для этого, но пока у меня нет большого успеха. Поэтому я и пришел сюда, чтобы попросить совета или помощи.

Я знаю, что код, который я предоставил в этом посте, невелик, но я был бы рад предоставить больше кода, который у меня есть в данный момент, когда необходимо.

...