我正在扩展运行SockJS服务器的Nodejs服务器。它是SockJS服务器存储每个连接客户端的基本聊天。
基本上我将它存储起来:
var clients = [];
var sockets = {};
// Identify this client
socket.name = socket.remoteAddress + ":" + socket.remotePort
// Put this new client in the list
clients.push(socket);
sockets[socket.name] = socket;
这是我写入套接字的方式:
sockets[socketName].write("{\"type\":\"type\", \"msg\": \"" + escp(obj.msg) + "\", \"name\": \"" + obj.name+ "\", \"location\": \"" + obj.location + "\"}");
我的想法是现在扩展并在亚马逊上启动更多实例。我会在前面加HAProxy
来填充负载。
问题是两个人聊天都必须在同一个实例上,因为在我的ec2 instances
之间共享了connectedClients。
任何想法如何实现这一目标?我是否需要将connectedClients
存储在数据库中? (这是可能的吗?)
基本上我需要在我的实例之间共享sockets
和clients
答案 0 :(得分:0)
我认为您可能必须将会话连接存储在redis / mongodb中,并让那些节点服务器对redis进行发布/订阅,以便在节点上具有一致的请求/响应。因此,当用户向HAProxy发送消息时,无论HAProxy路由在哪台服务器上,到节点的请求都将具有签入Redis(如果存在现有连接)。