Друзья, которые используют Nodejs, знают, что узел однопоточный, что означает, что при работе на 8-ядерном процессоре вы можете использовать только вычислительную мощность одного ядра.
Одиночные потоки всегда были критикой узлов, но с внедрением кластера в версии 0.6 эта ситуация изменилась. Разработчики могут полагаться на кластер, чтобы легко расширить свой сервер узлов на многопоточный сервер.
Что такое кластер
Кластер-это многопоточная библиотека, предоставленная узлом. Пользователи могут использовать его для создания нескольких потоков. Темы делятся портом прослушивания. Когда есть внешний запрос на этот порт, кластер будет пересылать запрос в случайный поток. Поскольку каждый поток узла будет занимать десятки мегабайт памяти, невозможно создать поток для каждого запроса, такого как PHP. Вообще говоря, количество созданных потоков не превысит количество сердечников процессоров больше всего.
Кода -копия выглядит следующим образом:
var cluster = require ('cluster');
var http = require ('http');
var numcpus = require ('os'). cpus (). Length;
if (cluster.ismaster) {
// работники вилки.
for (var i = 0; i <numcpus; i ++) {
cluster.fork ();
}
cluster.on ('exit', function (рабочий, код, сигнал) {
console.log («Работник» + работник.process.pid + 'die');
});
} еще {
// работники могут делиться любым соединением TCP
// в этом случае его HTTP -сервер
http.createserver (function (req, res) {
res.writehead (200);
res.end ("Hello World/N");
}). Слушай (8000);
}
Как показано в приведенном выше коде, Cluster.ismaster будет установлен на True при запуске программы. После вызова cluster.fork (), программа создаст поток и повторно его запустит. В настоящее время Cluster.ismaster будет установлен на ложном. В основном мы используем эту переменную, чтобы определить, принадлежит ли текущий поток к дочернему потоку.
Можно также отметить, что после создания каждого дочернего потока он будет прослушать порт 8000, не вызывая конфликты. Это функция общих портов кластера.
Связь между потоками
Когда потоки создаются, они не делятся памятью или данные друг с другом. Весь обмен данными может быть обработан только в основном потоке через Worker.send и Worker.on ('Message', Handler). В следующем перечислены пример системы вещания.
Кода -копия выглядит следующим образом:
var cluster = require ('cluster');
var http = require ('http');
var numcpus = require ('os'). cpus (). Length;
if (cluster.ismaster) {
var работники = [];
// Создать нового работника
функция newWorker () {
var Worker = cluster.fork ();
// слушать информацию. Если тип транслируется, он будет определяться как трансляция
Worker.on ('message', function (msg) {
if (msg.type == 'Broadcast') {
var event = msg.event;
// Отправить эту трансляцию всем работникам
рабочие.foreach (function (работник) {
Worker.send (событие);
})
}
});
возвращающийся работник;
}
for (var i = 0; i <numcpus; i ++) {
рабочие.push (newworker ());
}
cluster.on ('online', function (konayer) {
console.log («Работник %d - онлайн», работник. ID);
})
} еще {
var Worker = cluster.worker;
// трансляция должна отправить сообщение с типом трансляции, событие является трансляцией контента
Worker.broadcast = function (event) {
Worker.send ({
Тип: «трансляция»,
Событие: событие
});
}
// Это невозможно прослушать возвращенную информацию, используя Worker.on здесь.
process.on ('message', function (event) {
console.log («Работник:»+konyber.id+'восстановленное событие из'+event.workerid);
})
// Отправить трансляцию
Worker.broadcast ({
Сообщение: 'онлайн',
Рабочий: Worker.id
})
}
Проблемы, чтобы знать о
Выше также упоминается, что данные не могут быть переданы между потоками, и все обмены данных могут обмениваться только посредством связи между потоками. Кроме того, обмененные данные являются сериализуемыми, поэтому функции, файловые дескрипторы и HTTPResponse не могут быть переданы.
Если вы используете кластер, вам необходимо рассмотреть проблему обмена данными при разработке программы. Мой собственный подход состоит в том, чтобы хранить все данные, аналогичные сеансу в Redis, и каждый поток выполняет работу хранения и снятия средств, и все данные не помещаются в память узла.
Последний момент, кластер в настоящее время официально отмечен как экспериментальный по узлу, и API может измениться в будущем.