NodeJS Cluster如何在工作人员之间共享对象数组

Posted

技术标签:

【中文标题】NodeJS Cluster如何在工作人员之间共享对象数组【英文标题】:NodeJS Cluster how share object array across workers 【发布时间】:2017-03-28 14:02:25 【问题描述】:

所以我已经设置了一个简单的 nodejs 集群游戏,我是 nodejs 的新手。基本上玩家使用 socket.io 连接到我的工作人员,然后他们被创建到一个 Player 对象,然后添加到我的 PlayerManager.LIST 数组中。现在这给我带来了一些问题,因为 PlayerManager.LIST 在每个工作人员上并且没有同步。

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

目前的结构:

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

Git 仓库:https://github.com/mrhid6/game_app_v2

【问题讨论】:

【参考方案1】:

NodeJS 集群基于 Nodejs 子进程。在子进程中,您可以通过 IPC 通道上的消息在父进程(集群中的 Master)和子进程(集群中的工作者)之间发送数据。您可以使用消息事件对集群执行相同操作

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

【讨论】:

这可能需要一些清理 感谢您的回复,我已经尝试过这种方法,但是当玩家登录时,玩家列表会直接在每个工作人员上更新,如果我同时有两个用户,我会遇到一些问题会glith。 我设法让它工作,但是当我这样做时,例如 playerlist[0].move() 它说没有一个函数我认为这与 Json stringify 函数有关,它可以发送给工作人员. 设法让来自不同工作人员的两个玩家出现在屏幕上,但仍有一些同步问题想知道您是否能够查看我的 git 代码并查看我是否做错了什么?跨度>

以上是关于NodeJS Cluster如何在工作人员之间共享对象数组的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS|Cluster:如何将数据从主服务器发送到所有或单个孩子/工人?

在 AngularJS 和 Nodejs 之间共享代码

Nodejs集群仅将任务分配给一个工作者(任何)

使用 nodejs 在 docker 容器之间共享运行时数据的最佳方法是啥? (不是音量)

在 NodeJS 中使用集群时无法让所有工作人员进入工作程序块

Cluster 如何跟上 Node 的单线程概念?