@soofftt91

Как в NodeJS оптимальней всего часто запускать большое кол-во операций?

Есть проект на NodeJS в котором по расписанию (обычный setInterval) каждую минуту запускается примерно 200 однотипных операций. Запуск операций происходит с интервалом в 0.1 сек., но выполняются они 0.5 - 5 секунд. Все операции должны быть выполнены как можно за меньший срок, поэтому ждать пока выполнится 1-ая и запускать 2-ую и т.д. вообще не вариант. К тому же я не могу сильно увеличить интервал запуска операций (даже 0.1 сек. слишком большое значение для меня).

Примерный сценарий операций: получить некие данные через API > загрузить картинку с своего сервера > обработать её > сохранить > отправить картинку в другой сервис через их API.

На данный момент сервер справляется, но в момент запуска показатели загрузки процессора и памяти стремятся к максимальным значением для сервера.

Характеристики "сервера":
ba59e42992114eaca7b7c2eb6bfb21fa.pngСобственно вопрос. Допустим ли в ноде такой подход с запуском операций или это можно делать более грамотно и оптимально?
  • Вопрос задан
  • 358 просмотров
Пригласить эксперта
Ответы на вопрос 3
@deemaagog
а операции какого рода, i/o?
чтобы запустить параллельно можно к примеру использовать пакет async
async.parallel([
function(callback) {
setTimeout(function() {
callback(null, 'one');
}, 200);
},
function(callback) {
setTimeout(function() {
callback(null, 'two');
}, 100);
}
],
// optional callback
function(err, results) {
// the results array will equal ['one','two'] even though
// the second function had a shorter timeout.
});
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
запускать без паузы всю пачку в цикле, использовав по максимуму асинхронные функции (не ждать окончания предыдущего перед стартом следующего), тогда, возможно, будет ускорение от того, что асинхронные операции, такие, как получение по API или запись на диск, освободят основной поток собственно для действий node, получив из
java-ee-threads-vs-node-js-which-is-bettjava-ee-threads-vs-node-js-which-is-bett
Ответ написан
Комментировать
@RidgeA
А зачем запускать их через интервал какой-то?
Есть 200 однотипных задач.
На каждую задачу делается промис, и в итоге получается массив из 200 промисов.
Пором этим промисам делается Promise.all() и все. Если необходимо - обрабатывается результат выполнения всех промисов.

Если есть желание порулить количеством одновременных запросов по сети, то можно использовать
http.globalAgent

https://nodejs.org/api/http.html#http_http_globalagent
https://nodejs.org/api/http.html#http_agent_maxsockets
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы