【问题标题】:Who to manage properly mongodb data on socket (server side)谁在套接字上正确管理 mongodb 数据(服务器端)
【发布时间】:2015-01-17 06:27:06
【问题描述】:

我是第一次使用 Socket.io,我尝试制作一个简单的游戏。这一次,我有一个这样结构的 mongo 数据库:

| Sessions  |  | Users      |  | Games     |
|-----------|  |------------|  |-----------|
| * _id     |  | * _id      |  | * _id     |
| * user_id |  | * game_id  |  | * ...     |
| * ....    |  | * ...      |  |           |

我已经在套接字连接之前使用.set() 函数在套接字连接上检索到用户session_id

var io = require('socket.io').listen(server);

io.set('authorization', function(handshakeData, accept) {
    // Retrieve client session here and put data on handshakeData
});

// IO.Socket connection
io.sockets.on('connection', function(socket) {
    // session_id are accessible on socket here
});

但是现在问题: 每次我通过套接字收到客户端的请求(针对特定游戏的操作)时,我都必须:

  • 从套接字中获取 session_id
  • 向 mongo 询问关联会议
  • 再次向 mongo 询问与会话关联的用户,以验证客户端是否在此游戏中
  • 最后是游戏数据

这里有 3 个请求,仅用于检索每个套接字连接的信息。我每秒可以有很多套接字请求。

我很害怕 mongodb 会如何被套接字请求重载,我不知道最好的解决方案。

  1. 我可以将所有会话、用户和游戏对象保存在套接字上以直接访问吗?没有 mongo 请求
  2. 如果我这样做了,我该如何处理游戏更新? (如果其他玩家移动等)

谢谢大家的帮助,我很抱歉我的英语不好:/

【问题讨论】:

    标签: javascript node.js mongodb sockets


    【解决方案1】:

    您可以将该用户的数据保存在该套接字上下文的内存中。 (基于套接字的通信相对于基于单独请求的通信的主要优势。)如果您正在运行多个节点服务器实例,那么如果同一用户由两个不同的服务器更新,这可能会导致麻烦。您可能希望有一个 mongodb 字段作为该播放器的“最后更新”日期,您可以索引它并仅查询该字段而不是提取所有数据。当您更新播放器时,更新该字段,随后的请求将使缓存无效。像这样的多服务器通信的另一个选项是 op-log tailing。

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      相关资源
      最近更新 更多