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