我正在使用 Node.js 和 Socket.io 开发多人在线游戏。我希望有很多玩家加入游戏,所以我将它托管在 Amazon Opworks 上。
问题是服务器无法将套接字事件发送到连接到不同服务器的客户端。我正在使用 RedisStore 来管理 socket.io 会话。我相信 RedisStore 和 socket.io 以无缝的方式在后台处理了这种服务器间通信。这里引用另一个问题:socket.io 如何跨多个服务器发送消息?
但事实并非如此。如果消息在不同的服务器上,则消息不会传递给其他客户端;如果只有一台服务器,该应用程序可以工作,但如果我在 Opsworks 上使用使用 ELB 进行负载平衡的多台服务器,该应用程序将失败。
这只是整个代码的摘录。请忽略语法错误等(如果有)。
应用程序.js
//Redis Client Initialization
var redis = require("redis");
redis_client = require('redis-url').connect('redis://xxxxx');
//setting RedisStore for socket.io
var RedisStore = require('socket.io/lib/stores/redis')
, redis = require('socket.io/node_modules/redis')
, pub = redis.createClient(11042,'-----')
, sub = redis.createClient(11042,'-----')
, client = redis.createClient(11042,'-----');
// using RedisStore in combo with Socket.io to allow communications across multiple servers
io.set('store', new RedisStore({
redis : redis,
redisPub : pub,
redisSub : sub,
redisClient : client
}));
//socket communication specific code
io.of('/game')
.on('connection', function (socket) {
socket.on('init' , function(data){
var user_id = data.user_id; // collecting user_id that was sent by the client
var socket_id = socket.id;
redis_client.set("user_socket:"+user_id, socket_id, function(err, reply){
//stored a referece to the socket id for that user in the redis database
});
});
socket.on('send_message', function(data){
var sender = data.sender_id;
var reciepient = data.reciepient_id ; // id of the user to whom message is to be sent to
redis_client.get("user_socket:"+reciepient, function(err,socket_id){
if(socket_id){
var socket = io.of('/game').sockets[socket_id];
socket.emit("message", {sender : sender}); // This fails. Messages to others servers dont go through.
}
})
})
});