我们目前遇到的问题是我们的网络应用程序将错误的数据发送到套接字。基于我们所看到的情况,由于我们的多个服务器设置,似乎可能存在socketID冲突,但我们还没有确认。
行为
加入1个房间的用户将开始随机接收来自其他房间(他们尚未加入)的消息。当他们刷新时,他们又回到了他们应该得到的消息。
我们的配置
var express = require('express')();
var api = require('http').createServer(express);
/*
* Configure socket.io.
*/
var socketio = require('socket.io')(api, {
serveClient: true,
transports: ['websocket']
});
var redis = require('redis').createClient;
var adapter = require('socket.io-redis');
var pub = redis(appModules.config.redis.clients.socketio.port, appModules.config.redis.clients.socketio.host, {
return_buffers: true,
auth_pass: appModules.config.redis.password
});
var sub = redis(appModules.config.redis.clients.socketio.port, appModules.config.redis.clients.socketio.host, {
return_buffers: true,
auth_pass: appModules.config.redis.password
});
socketio.adapter(adapter({
host: appModules.config.redis.clients.socketio.host,
port: appModules.config.redis.clients.socketio.port,
pubClient: pub,
subClient: sub
}));
socketio.on('connection', function(socket) {
socket.emit('connection-event', 'socket connection successful for socket: ' + socket.id);
socket.on('disconnect', function() {
require('../../main_socket/v1/disconnect')(this);
});
socket.on('reconnect', function() {
require('../../main_socket/v1/reconnect')(this);
});
socket.on('client-event', function(data) {
data = JSON.parse(data);
appModules.shared.session.decryptToken(data.token)
.then(function(jwt) {
appModules.services.redis.clients.user_sessions.hgetallAsync(jwt.decodedToken.email)
.then(function(session) {
data.session = session;
require('../../main_socket/' + data.apiVersion + '/' + data.context + '/' + data.action)(data, socket);
})
.catch(function(err) {
logger.error(err);
});
})
.catch(function(err) {
logger.error(err);
});
});
});
假设
由于刷新似乎解决了特定用户的问题,因此我们假设它是一个套接字ID冲突,因为它们将在刷新时获得新的冲突。
附加说明
我们正在Heroku上托管我们的应用,并按照他们的会话亲和力指示(https://devcenter.heroku.com/articles/session-affinity),但这似乎没有对此问题产生任何影响。