NodeJS群集如何跨工作人员共享对象数组

时间:2016-11-14 20:20:05

标签: node.js node-cluster

所以我设置了一个简单的nodejs集群游戏,我是nodejs的新手。基本上玩家使用socket.io连接到我的worker,然后将它们创建为Player对象,然后添加到我的PlayerManager.LIST数组中。现在这会导致一些问题,因为PlayerManager.LIST在每个工作者身上并且不同步。

所以我的问题是,有没有更好的方法来做到这一点,如果我连接到工人2,我会看到与工人1相同的玩家列表。

目前的结构:

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

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

1 个答案:

答案 0 :(得分:2)

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
    })
};