2016-11-14 36 views
2

所以我建立了一個簡單的nodejs集羣遊戲,我是nodejs的新手。基本上玩家使用socket.io連接到我的工作人員,然後他們創建到一個玩家對象,然後添加到我的PlayerManager.LIST數組。現在,這引起我一些問題,因爲PlayerManager.LIST在每個工作人員身上,並且沒有同步。NodeJS Cluster如何跨工作人員共享對象陣列

所以我的問題是,是否有更好的方法來做到這一點,如果我連接到工人2,我會看到與工人1相同的球員列表。此刻

結構:

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

混帳回購協議: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來管理它 –