Node.js 在nodejs实例之间共享对象(高i/o)

Node.js 在nodejs实例之间共享对象(高i/o),node.js,memcached,socket.io,cluster-computing,Node.js,Memcached,Socket.io,Cluster Computing,我正在构建一个基于nodejs/socket.io的游戏,并且我正在尝试实现节点集群,以利用多核机器(很少的机器,每个机器都有很少的核心)的优势。我发现memcache将是一个很好的解决方案,但我不能完全确定它是否能经受住高负载,因为每个游戏每秒大约写/读50次。另外,当所有客户端连接到不同的服务器时,向它们广播消息的最佳解决方案是什么。例如,玩家X连接到节点1,他执行一个简单的操作,我如何将该操作投射到连接到节点2的玩家Y。您实际上可以将对象序列化为JSON字符串,并将其作为参数传递,并在每个

我正在构建一个基于nodejs/socket.io的游戏,并且我正在尝试实现节点集群,以利用多核机器(很少的机器,每个机器都有很少的核心)的优势。我发现memcache将是一个很好的解决方案,但我不能完全确定它是否能经受住高负载,因为每个游戏每秒大约写/读50次。另外,当所有客户端连接到不同的服务器时,向它们广播消息的最佳解决方案是什么。例如,玩家X连接到节点1,他执行一个简单的操作,我如何将该操作投射到连接到节点2的玩家Y。

您实际上可以将对象序列化为JSON字符串,并将其作为参数传递,并在每个工作进程(CPU数量)处反序列化

否则,您可以使用
cluster.worker[].send()
,它将自动处理序列化/反序列化


有关更多信息:如果要跨线程进行集群,请检查,然后使用Redis作为Socket.IO存储是一个完美的解决方案

Redis是一个速度极快的数据库,完全由内存运行,可以在一秒钟内支持数千条发布/订阅消息。Socket.IO内置了对Redis的支持,在使用它时,从Socket.IO的一个实例发出的任何消息都会发布到Redis,订阅了相同Redis实例的所有Socket.IO实例也会发出相同的消息

以下是设置每个Socket.IO实例的方法:

var RedisStore = require('socket.io/lib/stores/redis');
var redis  = require('socket.io/node_modules/redis')

io.set('store', new RedisStore({
  redisPub: redis.createClient(),
  redisSub: redis.createClient(),
  RedisClient: redis.createClient()
}));

当Socket.IO设置为这样,并且您有一个Redis服务器时,一个简单的
IO.sockets.emit()
将广播到任何服务器上的所有客户端,而不管是哪个服务器执行了代码,如果所有服务器都发布/订阅Redis实例。

谢谢您的回答。遗憾的是,redis并不像我读到的那样可伸缩。我还需要在多台机器上扩展项目。Redis用于跨机器扩展。您甚至可以通过自动故障切换设置Redis的主/从实例。