2016-08-31 2 views
10

Кто-нибудь знает, как запустить кластер узлов на окнах? Я не смог найти ни одной статьи в Интернете и не могу показаться, чтобы решить эту проблему:Как запустить кластер узлов на окнах?

events.js:160 
     throw er; // Unhandled 'error' event 
    ^

Error: write ENOTSUP 
    at exports._errnoException (util.js:1007:11) 
    at ChildProcess.target._send (internal/child_process.js:634:20) 
    at ChildProcess.target.send (internal/child_process.js:521:19) 
    at sendHelper (cluster.js:751:15) 
    at send (cluster.js:534:12) 
    at cluster.js:509:7 
    at SharedHandle.add (cluster.js:99:3) 
    at queryServer (cluster.js:501:12) 
    at Worker.onmessage (cluster.js:449:7) 
    at ChildProcess.<anonymous> (cluster.js:765:8) 

И код ... был добавлен

if (cluster.isMaster) { 
    for (let i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 
    cluster.on('online', (worker) => { 
     console.log('Worker ' + worker.process.pid + ' is online'); 
    }); 
    cluster.on('exit', (worker, code, signal) => { 
     console.log(`Worker ${worker.process.pid} died with code ${code} and signal ${signal}`); 
    }); 
} else { 
    console.log('else part '); 
    openPort(); 
} 

function openPort() { 
    let server = dgram.createSocket('udp4'); 
    server.bind(port, host); 
    server.on('message', processMessage); 
} 
+0

Этот код работает для меня - где остальная часть вашего кода и какая у вас версия Node.js. – AntonB

+0

Какую версию node.js вы используете. [Этот отчет об ошибках] (https://github.com/nodejs/node-v0.x-archive/issues/14382) предполагает, что ошибка в Windows в этой области была исправлена ​​в прошлом году. Я не уверен, в каких версиях было исправлено исправление. – jfriend00

+0

Также, что делает 'openPort()' do? – jfriend00

ответ

1

Поддержка UDP кластеризация в v0. 11.14 (для Linux и OSX). Отметьте file на узле node.js master, в котором говорится, что «кластеризация dgram в настоящее время не поддерживается в окнах»

+0

Использование версии 6.2.2 – wayofthefuture

+0

Узел не поддерживает кластеризацию dgram на окнах, обновляя мой ответ с подробностями. – Vibhaj

+0

Знаете ли вы, есть ли другой модуль, отличный от dgram, который может это сделать? – wayofthefuture

1

В текущем узле js-версии я использую ниже код для создания кластера в окнах.

var cluster = require('cluster'); 
var numCPUs = require('os').cpus().length; 
if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 


    cluster.on('exit', function(worker, code, signal) { 
    console.log("worker ${worker.process.pid} died"); 
    cluster.fork(); 
    }); 
} else { 
    var express = require('express'); 
    var http = require('http'); 

    // init app 
    var app = express(); 

    function createServer(app) { 
    return http.createServer(app); 
    } 

    app.locals.server = createServer(app); 

    app.locals.server.listen(port, function() { 
    console.info("server online"); 
    }); 
} 

Это создаст кластеры на одном и том же порту.

+0

Он должен быть портом udp – wayofthefuture

0

Итак, для того, чтобы использовать UDP с узла кластера на Windows, вы должны вызвать server.bind так:

server.bind({port: 1900, exclusive: true}, function() { 
     console.log('PORT BIND SUCCESS'); 
     server.setBroadcast(true); 
     server.setMulticastTTL(128); 
     server.addMembership(multicastAddress, myIp); 
    }); 

Ключом часть передать в объект {порт: порт, эксклюзивный: true} к функции bind. Я нашел ответ здесь: https://github.com/misterdjules/node/commit/1a87a95d3d7ccc67fd74145c6f6714186e56f571

+0

В дополнение: Clustering on windows работает нормально, пока вы не привязываетесь к порту UDP. Если вы это сделаете, вы должны убедиться, что вы указываете «эксклюзивное» свойство как истинное, как предлагалось @Blighty. Также потому, что каждый кластер попытается связать() с одним и тем же портом, только первый будет успешно подключаться.Другие, вероятно, вынут ошибка, заявив, что адрес уже используется (привяжите EADDRINUSE 0.0.0.0:5007). Обращайтесь с ошибкой, и она должна работать нормально. – Lothre1

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