跨节点集群存储 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 用于单一目的)。
我目前在 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 用于单一目的)。