【发布时间】:2017-04-17 14:58:13
【问题描述】:
我们正在 node js 项目中通过 socket.io 实现聊天和其他通知。
我们需要保留用户 -> 套接字映射。
为此,我们在 app.js 中声明了全局变量
global.user_sockets = {};
并在令牌认证后创建新连接时在 user_sockets 数组中分配用户 ID、套接字映射。
user_sockets[data.userId]=socket;
对于使用全局变量有很多猜测。有用户说多进程使用不好。
对此还有其他解决方案吗?
【问题讨论】:
-
你看过 Redis 发布/订阅吗?
-
我们也考虑过这一点,但是添加另一个内存管理层而不是这个实现有用吗?
-
好吧,如果您的用户通过登录启动会话,您只需将 socket.id 与用户会话 id 相关联,然后可以将 socket.io 服务器对象作为参数传递并调用 emit等等。您还可以使用 Redis 发布/订阅,只发布格式化的消息,让订阅者函数处理所有事情,并将整个工作保持在一个脚本中。许多人会同意使用全局变量不是最佳选择。您可能需要评估许多/其他选项以得出最适合您的应用程序的选项。