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

时间:2013-09-19 06:29:38

标签: node.js memcached socket.io cluster-computing

我正在建立一个基于nodejs / socket.io的游戏,我试图实现节点集群以利用多核机器(少数机器,每个机器都有很少的核心)。我发现memcache将是一个不错的解决方案,但我不完全确定它是否能够承受高负荷,因为每个游戏每秒会进行大约50次写入/读取。此外,当所有客户端连接到不同的服务器时,向所有客户端广播消息的最佳解决方案是什么。例如,玩家X连接到节点1,他做了一个简单的动作,以及我如何将动作广播到连接到节点2的玩家Y.

2 个答案:

答案 0 :(得分:1)

如果您要跨线程进行集群,那么使用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实例。

答案 1 :(得分:0)

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

否则您可以使用cluster.worker[<id>].send(<object>)自动处理序列化/反序列化。

有关详情:请查看Node API docs