Я сейчас занят написанием 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, пытаясь найти хорошее руководство / решение для этого, но пока у меня нет большого успеха. Поэтому я и пришел сюда, чтобы попросить совета или помощи.
Я знаю, что код, который я предоставил в этом посте, невелик, но я был бы рад предоставить больше кода, который у меня есть в данный момент, когда необходимо.