将Socket.io对象存储在持久数据库或redis中

时间:2017-06-25 17:47:13

标签: node.js sockets nginx redis socket.io

构建客户服务聊天应用程序。因此需要跟踪登录套接字的客户并将其附加到管理员/代理商室。

截至目前,我已通过使用简单的// Admin Socket - admins[socket.username] = socket; // Customer socket users[socket.roomID] = socket; 对象实现了此目的。但是为了扩展应用程序,我需要找到一个可以存储它们的地方。由于Socket对象采用循环JSON的形式,因此我无法将其存储在Redis中。我尝试使用'Douglas Crockford的Cycle.js,但看起来它正在改变decycle / retrocycle中对象的本质。

请帮助我找到一个能够跟踪客户和解决方案的解决方案代理套接字并将其作为请求连接到代理的前端。

当前解决方案:

{{1}}

需要在多核Linux机器上运行此解决方案,使用16个内核,用于16个Socket服务器/ node.js集群,由Nginx代理。因此需要快速找到稳健架构的解决方案。

还有一个信息:

  1. 我正在使用Redis for Sub / pub进行扩展。
  2. 使用Redis存储短历史消息。
  3. P.S。 (在我的组织中不再允许使用MongoDB。基于Mongo的解决方案对我不起作用。)

2 个答案:

答案 0 :(得分:2)

要使用Redis扩展到多个节点,请查看socket.io-redis

通过使用socket.io-redis适配器运行socket.io,您可以在不同的进程或服务器中运行多个socket.io实例,这些进程或服务器都可以相互广播和发送事件。

还可以看一下GitHub上的原始帖子:How can i store Socket object in Database

答案 1 :(得分:0)

套接字不可序列化,您无法将它们导出到系统外部(redis或任何其他外部存储)。这是因为套接字表示服务器和客户端之间的实时网络连接,它在服务器外部没有意义,因为没有表示连接。

您可能需要的是存储活动用户会话以及重新创建连接所需的所有必要信息,并将会话恢复到以前的状态:用户名,roomName等。