2016-11-14 8 views
2

Итак, у меня есть простая кластерная игра nodejs, я новичок в nodejs. в основном игроки подключаются к моему рабочему, используя socket.io, затем они создаются для объекта Player, а затем добавляются в мой массив PlayerManager.LIST. Теперь это вызывает у меня некоторые проблемы, так как PlayerManager.LIST находится на каждом из рабочих и не синхронизирован.NodeJS Cluster как распределять массив объектов между рабочими

Итак, мой вопрос в том, есть ли лучший способ сделать это, чтобы, если я подключусь к работнику 2, я вижу тот же список игроков, что и рабочий 1.

Структура на данный момент:

app.js 
-> worker 
->-> PlayerManager (Contains List) 
->->-> Player 

Git Repo: https://github.com/mrhid6/game_app_v2

ответ

0

NodeJS Кластеры основаны на процессах Nodejs ребенка. В дочерних процессах вы можете отправлять данные между родителями (мастер в кластере) и дочерним элементом (рабочий в кластере) через сообщения по каналу IPC. Вы можете сделать то же самое с кластерами, используя сообщение события

var cluster = require('cluster'); 
var _ = require('lodash'); 
var http = require('http'); 
var workers = []; 
var workerCount = 4; 

if (cluster.isMaster) { 
    for (var i = 0; i < workerCount; i++) { 
    var worker = cluster.fork(); 

    worker.on('message', function(msg) { 
     if (msg.task === 'sync') { 
      syncPlayerList(msg.data); 
     } 
    }); 
    } 
    workers.push[worker]; 

} else { 
    var worker = new Worker(); 
    process.on('message', function(msg) { 
    if (msg.task === 'sync') { 
     worker.playerList = msg.data; 
    } 
    }); 
} 

function syncPlayerList (playerList) { 
    _.forEach(workers, function (worker) { 
     worker.send({ 
      task: 'sync', 
      data: playerList 
     }); 
    }); 
}; 


// worker class 
function Worker() { 
    this.playerList = []; 
} 

Worker.prototype.sendSyncEvent = function() { 
    process.send({ 
     task: 'sync', 
     data: this.playerList 
    }) 
}; 
+0

это может потребоваться некоторым очистки –

+0

Спасибо за ответ, я попробовал этот метод, но когда игрок входит в списке игроков обновляются на каждом работнике непосредственно и я имел некоторые проблемы, в которых, если бы у меня было два пользователя, в то же время они будут гнить. – user2716281

+0

вы можете управлять этим с помощью setTimeout –