2016-07-07 3 views
0

В настоящее время я разрабатываю приложение узла js с API REST, который предоставляет данные из mongo db.Приложение NodeJs - Повторное задание - Одиночные или несколько дочерних процессов?

Приложение должно обновлять некоторые данные каждые 5 минут, вызывая внешнюю службу (может потребоваться более одной минуты, чтобы получить новые данные).

я решил выделить эту задачу в child_process, но я не уверен, что мне нужно поставить в этом процессе ребенок:

  • только функция будет выполняться. Расписание управляется основным процессом.
  • Независимый процесс, который автоматически обновляет данные каждые 5 минут и отправляет сообщение в основной процесс каждый раз, когда обновление выполняется.

Я не знаю, есть ли большая цена, чтобы начать новый дочерний процесс каждые 5 минут или если я должен использовать только один долгое время работаю дочерний процесс или если я overthinking проблемы ^^

EDIT - информация по задаче обновления

задача обновления может занять до одной минуты, но она состоит во многих небольших задачах (сбора информации от многих внешних поставщиков), чем работать асинхронно у многого я даже не нужен детский процесс?

Спасибо!

ответ

1

Не имеет значения общее время, которое требуется для получения данных от внешней службы, если вы используете асинхронные запросы. Важно то, сколько CPU вы используете при этом. Если в большинстве случаев ожидается, что внешняя служба ответит или отправит данные, ваш сервер node.js просто сидит без дела большую часть времени, и вам, вероятно, не нужен дочерний процесс.

Поскольку node.js является асинхронным, он может с радостью иметь много открытых запросов, которые находятся «в полете», что он ждет ответов, и это требует очень небольших системных ресурсов.

Поскольку node.js является однопоточным, использование ЦП, как правило, требует необходимости в дочернем процессе. Если для получения ответа от внешней службы требуется 5 минут, но только 50 мс фактического времени процессора для обработки этого запроса и что-то с ним делать, то вам, вероятно, не нужен дочерний процесс.

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


Я не знаю, есть ли большая цена, чтобы начать новый дочерний процесс каждые 5 минут или если я должен использовать только один долгое время работает дочернего процесса или если я overthinking проблема

Существует определенная стоимость для запуска нового дочернего процесса. Это не огромно, но если вы собираетесь делать это каждые 5 минут, и это не занимает огромного объема памяти, то, вероятно, лучше просто запустить дочерний процесс один раз, настроить управление расписанием внешняя услуга полностью зависит от ее собственной, а затем она может связывать результаты с другим процессом node.js по мере необходимости. Это делает процесс второго узла более самодостаточным, и единственной точкой взаимодействия между этими двумя процессами является передача обновления. Такое разделение функций и ответственности обычно считается хорошим. В проекте с несколькими разработчиками вы могли бы легко иметь разных разработчиков, работающих над каждым приложением.

+0

ok приятное объяснение, поэтому, если у меня нет какой-либо блокирующей задачи, я не должен беспокоиться об этом до того, как проблема (= проблема с производительностью) произойдет? – Thomas

+0

@ Томас. Да, это был бы мой совет. Не усложняйте вещи, пока не получите фактические доказательства того, что это необходимо. – jfriend00

1

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

Для вашего потребительной случае я имею в виду, может быть, вы можете использовать setInterval повторно выполнить операцию, которые вы можете определить более крошечные асинхр вызовы через использование своего рода promises рамках как bluebirdJS?

Для получения дополнительной информации см:

setInterval: https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval

setInterval()

Многократно вызывает функцию или выполняет фрагмент кода, с фиксированным времени задержка между каждым вызовом. Возвращает интервалID.

Пример код:

setInterval(function() { 
    console.log("I was executed"); 
}, MILLISECONDS_IN_FIVE_MINUTE); 

Обещание: http://bluebirdjs.com/docs/features.html

Пример код:

new Promise(function(resolve, reject) { 
    updateExternalService(data) 
    .then(function(response) { 
     return this.parseExtResp(response); 
    }) 
    .then(function(parsedResp) { 
     return this.refreshData(parsedResp); 
    }) 
    .then(function(returnCode) { 
     console.log("yay updated external data source and refreshed"); 
     return resolve(); 
    }) 
    .catch(function(error) { 
     // Handle error 
     console.log("oops something went wrong ->" + error.message); 
     return reject(); 
    }); 
    } 
+0

Я уже использую обещание и setInterval, мне просто интересно, нужно ли изолировать задачу в отдельный процесс? Имеет ли это смысл ? – Thomas

+0

Вы делаете это только потому, что пострадали от какой-то проблемы с производительностью? Архитектура узла Hmm multi-process не имеет для меня никакого смысла. Вы пытаетесь использовать все ваши ядра процессора? Вероятно, проверьте, что такое 'lscpu', как в первую очередь, если вы понимаете, что ваше приложение-узел использует только 1 из 10 ядер процессора интенсивно, и программа не может масштабироваться больше, а затем, вероятно, попробовать многопользовательскую вещь. В противном случае будет лучше выполнять профилирование кода? –

+0

Может быть, я слишком задумываюсь о проблеме, потому что на данный момент у меня нет проблемы с производительностью ... Поэтому, если проблема с производительностью и отсутствие кода блокировки, мне просто нужно разрешить цикл событий выполнять работу? – Thomas

1

Это зависит от того, как сцепление между вашим приложением и задачами автоматического обновления.

Если задача автоматического обновления может работать автономно, без взаимодействия с вашим приложением, лучше начать свою задачу как новый процесс. Использовать child_process напрямую - это не очень хорошая идея, процесс child/monitor/respawn child сложный, вы можете использовать crontab или pm2 для управления им.

Если задача автоматического обновления зависит от вашего приложения, вы можете напрямую использовать child_process, отправить сообщение ему по расписанию. Но сначала попробуйте разбить эту зависимость, это упростит ваше приложение, легко развертывается и поддерживается отдельно. Детский процесс длится долго или один выстрел не вопрос, пока у вас есть сотни таких задач, работающих на одной машине.

+0

Интересно, поэтому, возможно, иметь очередь, чтобы заставить их общаться, может быть решением для меня! Спасибо – Thomas

+0

родительский и дочерний канал IPC уже встроен: [child.send] (https://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle_options_callback) – tangxinfa

+0

Да, я это видел, но он работает только, если у вас есть родительские/дочерние процессы – Thomas

Смежные вопросы