如何访问所有集群中的套接字会话

how to access socket session in all clusters

我正在使用 PM2 在集群模式下设置 socket.io。

我正在使用 socket.io-redis 包,它在集群模式下工作正常。

但是当我想访问所有连接的套接字时,问题就出现了。因为进程不知道集群模式下其他进程的套接字连接。

我认为 socket.io-redis 跟踪所有连接的套接字及其所有会话信息,但它没有。 有什么方法或解决方案可以访问套接字中所有进程中存在的所有套接字连接。io/Nodejs?

Socket.io-redis 在某种意义上确实保持跟踪..

来自他们的文档

》Redis适配器扩展了内存适配器的广播功能:数据包也被发布到一个Redis通道(通道名称的格式见下文)

每个 Socket.IO 服务器接收此数据包并将其广播到自己的已连接套接字列表。

所以基本上,redis 被用作代理来告诉每个套接字服务器基于 X 通道等发出。允许你有一个 socket.io 服务器在集群模式下工作,但正如你提到的它可以当您需要跟踪发射之外的事物时,就达不到要求了。

那么这给我们留下了什么……好吧,您可以通过 socket.io-redis 使用自定义挂钩,但我个人发现它真的很难理解和使用,并且个人成功有限。我认为新版本的 socket.io 和 socket.io redis 有一些调整可以使这更简单,但我还没有尝试过。

相反,我们做的是使用redis hset和jget来存储socket和一个用户的ID,然后当我们想要让所有用户在线时,我们可以查询redis来获取在线用户或用户的列表特定房间等

您需要做的是添加 redis 包并附加连接到常规发布/订阅。

然后,当用户加入房间或您的服务器时,您将执行 hset。第一次加入我们的看起来像这样

redis.hset([collection-name],[Field],[value])

所以在代码中它看起来像

redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)

这将在 redis 中设置一个值,因此集合名称是一个值(对我们来说它是频道的唯一 ID)然后我们为字段存储 'socket.id' 以及 'nick-name' 的价值。如果用户未登录,此值为用户 ID 或匿名

然后,当我们想抓取房间里的人时,我们使用 hget 命令

redis.HGETALL([collection-name],function(err,results){}

所以在 emit 内部,我们调用 redis.HGETALL 命令来获取我们传入的特定集合中的所有项目,并将其发送回所有连接的用户。