Создание высокопроизводительного приложения node.js с кластером и узлом-webworker - PullRequest
5 голосов
/ 09 сентября 2011

Я не владелец node.js, поэтому я хотел бы получить больше точек зрения по этому поводу.

Я создаю веб-сервер HTTP node.js, который должен обрабатывать не только множество одновременных соединений, но и долго выполняющиеся задания. По умолчанию node.js запускается в одном процессе, и если есть фрагмент кода, который требует много времени для выполнения любого последующего соединения, необходимо дождаться, пока код завершит то, что он делает в предыдущем соединении.

Например:

var http = require('http');
http.createServer(function (req, res) {

  doSomething(); // This takes a long time to execute

  // Return a response
}).listen(1337, "127.0.0.1");

Итак, я подумал о том, чтобы запустить все длительные задания в отдельных потоках с помощью библиотеки node-webworker :

var http = require('http');
var sys = require('sys');
var Worker = require('webworker');
http.createServer(function (req, res) {

  var w = new Worker('doSomething.js'); // This takes a long time to execute

  // Return a response
}).listen(1337, "127.0.0.1");

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

Таким образом, я рассчитываю сбалансировать клиентские соединения через разные процессы с cluster (скажем, 4-узловым процессом, если я запустил его на четырехъядерном процессоре), а затем выполнить долгосрочное задание в отдельных потоках с node-webworker.

Что-то не так с этой конфигурацией?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Я вижу, что этому посту несколько месяцев, но я хотел предоставить комментарий к нему на случай, если кто-то придет.

"По умолчанию node.js запускается в одном процессе, и еслиесть фрагмент кода, который требует много времени для выполнения любого последующего соединения, и должен ждать, пока код не завершит то, что он делает с предыдущим соединением. "

^ - Это не совсем так.Если doSomething ();требуется выполнить до того, как вы отправите ответ, тогда да, но если это не так, вы можете использовать асинхронную функциональность, доступную вам в ядре Node.js, и немедленно вернуться, пока этот элемент обрабатывается вbackground.

Быстрый пример того, что я объясняю, можно увидеть, добавив следующий код на ваш сервер:

setTimeout(function(){
    console.log("Done with 5 second item");
}, 5000);

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

1 голос
/ 20 февраля 2014

Почему бы вам просто не скопировать и не вставить свой код в файл и не запустить его через JXcore , как

$ jx mt-keep:4 mysourcefile.js

и посмотрите, как это работает. Если вам нужна настоящая многопоточность, не выходя из безопасности однопоточности, попробуйте JX. его 100% узел. JS 0,12+ совместим. Вы можете создавать потоки и запускать целое приложение node.js внутри каждого из них отдельно.

0 голосов
/ 09 сентября 2011

Вместо этого вы можете попробовать Q-Oper8, поскольку он должен обеспечить более гибкую архитектуру для такого рода вещей. Полная информация по адресу:

https://github.com/robtweed/Q-Oper8

...