3

だから私は単純なnodejsクラスターゲームをセットアップしました.nodejsは初めてです。基本的に、プレイヤーは socket.io を使用してワーカーに接続し、プレイヤー オブジェクトに作成され、PlayerManager.LIST 配列に追加されます。PlayerManager.LIST が各ワーカーにあり、同期されていないため、これによりいくつかの問題が発生します。

私の質問は、ワーカー 2 に接続するとワーカー 1 と同じプレイヤー リストが表示されるようにするためのより良い方法があるかということです。

現時点での構造:

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

Git リポジトリ: https://github.com/mrhid6/game_app_v2

4

1 に答える 1

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
    })
};
于 2016-11-14T21:01:40.307 に答える