我正在构建一个基于 nodejs/socket.io 的游戏,并且我试图实现节点集群以利用多核机器(几台机器,每台机器都有几个核心)。我发现 memcache 将是一个不错的解决方案,但我不完全确定它是否能承受高负载,因为每个游戏每秒会进行大约 50 次写入/读取。还有什么是在所有客户端连接到不同服务器时向所有客户端广播消息的最佳解决方案。例如玩家 X 连接到节点 1,他做了一个简单的动作,以及我如何将动作广播到连接到节点 2 的玩家 Y。
问问题
1080 次
2 回答
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 实例,那么无论哪个服务器执行代码,一个简单的都会向任何服务器上的所有客户端广播。
于 2013-09-19T07:52:48.097 回答
0
您实际上可以将对象序列化为 JSON 字符串并将其作为参数传递并在每个工作人员(CPU 数量)处反序列化。
否则,您可以使用cluster.worker[<id>].send(<object>)
which 将自动处理序列化/反序列化。
更多信息:查看节点 API 文档
于 2013-09-19T06:38:49.287 回答