2013-04-07 4 views
0

Я отправил вопрос на номер github repo, чтобы отслеживать его там!Node.js cluster + collect

Я запускаю кластерное приложение, которое может быть на машине с N ядрами. Скажем, я запускаю 2 экземпляра приложения локально для тестирования, действительно подражая 2-мя различным коробкам. Таким образом, N ядер на машинах N с использованием модуля cluster (на самом деле машины N статичны, например, всего 2 за балансировкой нагрузки AWS).

  1. Как правильно настроить collective.js вариант «all_hosts» для этого? Я бы использовал process.id как-то вместе с IP?

Запуск фрагменты кода будет что-то вдоль линий 2 Баш терминалов:

терминала 1:

coffee cluster1

терминал 2:

coffee cluster2

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

cluster1.coffee:

cluster = require 'cluster' 
numCPUs = require('os').cpus().length 

if cluster.isMaster 

    i = 0 
    cluster.setupMaster 
    exec: './server1' 

    console.log "App 1 clustering with: #{numCPUs} clusters" 

    while i < numCPUs 
    cluster.fork() 
    i++ 

    cluster.on 'fork', (worker) -> 
    console.log 'Forked App 1 server worker ' + worker.process.pid 

server1.coffee:

Collective = require 'collective' 

all_hosts = [ 
    host: 'localhost', port: 8124 # Wrong 
] 

collective = new Collective(
    host: 'localhost' 
    port: 8124 
, all_hosts, (collective) -> 

) 

collectiveUpsert =() -> 

    num = Math.floor((Math.random()*10000)+1) 

    data = 
    num: num 

    console.log process.pid + ' sees current num as: ' + JSON.stringify(collective.get('foo.bar')) 
    console.log process.pid + ' setting num to: ' + JSON.stringify(data) 

    collective.set 'foo.bar', data 

setInterval (-> 
    collectiveUpsert() 
), 5 * 1000 

cluster2.coffee:

cluster = require 'cluster' 
numCPUs = require('os').cpus().length 

if cluster.isMaster 

    i = 0 
    cluster.setupMaster 
    exec: './server2' 

    console.log "App 2 clustering with: #{numCPUs} clusters" 

    while i < numCPUs 
    cluster.fork() 
    i++ 

    cluster.on 'fork', (worker) -> 
    console.log 'Forked App 2 server worker ' + worker.process.pid 

server2.coffee:

Collective = require 'collective' 

all_hosts = [ 
    host: 'localhost', port: 8124 # Wrong 
] 

collective = new Collective(
    host: 'localhost' 
    port: 8124 
, all_hosts, (collective) -> 

) 

collectiveUpsert =() -> 

    num = Math.floor((Math.random()*10000)+1) 

    data = 
    num: num 

    console.log process.pid + ' sees current num as: ' + JSON.stringify(collective.get('foo.bar')) 
    console.log process.pid + ' setting num to: ' + JSON.stringify(data) 

    collective.set 'foo.bar', data 

setInterval (-> 
    collectiveUpsert() 
), 5 * 1000 

ответ

0

Для того, чтобы использовать collective.js с cluster и/или несколько серверов, вы должны запустить его на каждом дочернем процессе Node.js. Подумайте об этом как о модуле http, где вам нужно создать слушателя на каждом дочернем/подчиненном устройстве, а не на ведущем устройстве (http://nodejs.org/api/cluster.html#cluster_cluster). Следуя подобной логике, для collective.js, вы должны сделать что-то вроде этого (один сервер):

if (cluster.isMaster) { 
    // fork n children 
} else { 
    var current_host = {host: "localhost", port: 10000}; 
    current_host.port += cluster.worker.id; // this is incremented for every new process. 

    var all_hosts = [ 
     {"host": "localhost", "port": 10001}, 
     {"host": "localhost", "port": 10002}, 
     {"host": "localhost", "port": 10003}, 
     {"host": "localhost", "port": 10004}, 
     {"host": "localhost", "port": 10005}, 
     {"host": "localhost", "port": 10006} 
     // must be the same amount as is the child process count. 
    ]; 

    var collective = new modules.collective(current_host, all_hosts, function (collective) { 
     // Do your usual stuff. Start http listener, etc... 
    }); 
} 

Вы должны изменить Localhost ваших IP-адресов и убедитесь, что порты увеличиваем правильно, если вы хотите использовать этот на разных серверах.

За дополнительной информацией вы можете проверить неочищенные тесты на

Надежда, что помогает! Если вам нужна дополнительная помощь, пожалуйста, спросите.

P.S. По общему признанию, этот способ является громоздким и требует более четкого объяснения.Надеюсь, что в ближайшем будущем мы выясним более простой и понятный процесс инициализации. В дополнение к этому, проясните readme и дайте несколько полных примеров.