跨节点集群存储 Javascript 映射

Storing Javascript Map across node clusters

我目前在 Javascript 映射中保存对套接字的引用。我需要让所有集群上的节点 运行 的实例都可以访问此映射,以便我始终可以获得与用户关联的 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;

I need to make this map accessible to instances of node running on all clusters, so that I can always get the socket.id associated with a user.

如果需要与所有集群共享数据,则不能使用Javascript in-memory 对象,例如Map 对象。相反,您将需要使用可以在多个进程(您的集群进程)之间共享的东西。类似这种情况的常见解决方案是使用所有集群进程都可以访问的 Redis(内存数据库)。 Redis 具有可让您执行类似于 Map 对象的操作的功能。

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

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