跨节点集群存储Javascript Map



我当前将对套接字的引用保存在Javascript Map中。我需要让所有集群上运行的节点实例都可以访问这个映射,这样我就可以始终获得与用户关联的socket.id。在我的应用程序模块中:

var socketMap = new Map()
// socket.io events
io.on( "connection", function( socket )
{
if (socket.request.session.authenticated_user) {
console.log( "A user connected" );
socketMap.set(socket.request.session.authenticated_user.toString(), socket.id);
socket.on( "disconnect", function() {
console.log( "A user disconnected" );
socketMap.delete(socket.request.session.authenticated_user);
});
}
});
var emit_to_socket = function (user_id, message) {
if (socketMap.has(user_id.toString())) {
if (socketMap.get(user_id.toString())) {
io.to(socketMap.get(user_id.toString())).emit('message', message);
}
}
};
exports.emit_to_socket = emit_to_socket;

我需要让所有集群上运行的节点实例都可以访问这个映射,这样我就可以始终获得与用户关联的socket.id。

如果需要与所有集群共享数据,则不能在内存对象(如Map对象(中使用Javascript。相反,您需要使用可以在多个进程(集群进程(之间共享的东西。类似的常见解决方案是使用Redis(内存数据库(,然后所有集群进程都可以访问该Redis。Redis有一些功能可以让你做一些类似于Map对象的事情。

事实上,socket.io的集群版本已经为此使用了redis,因此它可以跟踪所有集群中的所有房间和所有连接的用户,任何集群都可以广播到任何房间或发送到任何套接字,无论他们连接到哪个集群。

或者,您可以让主进程保留Map对象,然后集群中的每个其他进程都必须通过进程间通信与主集群通信,以从单个Map对象(本质上是穷人的Redis,用于单一目的(中获取或设置内容。

最新更新