javascript - 谁来正确管理套接字上的 mongodb 数据(服务器端)

标签 javascript node.js mongodb sockets

我是第一次使用 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 请求关联 session
  • 再次询问 mongo 是否有关联到 session 的用户,以验证客户端是否正在玩此游戏
  • 最后是游戏数据

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

我担心 mongodb 会因套接字请求而重载,并且我不知道最好的解决方案。

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

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

最佳答案

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

关于javascript - 谁来正确管理套接字上的 mongodb 数据(服务器端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27021886/

相关文章:

javascript - 当 JS 变量等于 x 时,尝试在 HTML div 选项卡中显示某些 "storyline"

javascript - 如何使用 Cytoscape.js 使节点的名称与其 ID 不同?

javascript - iframe 在加载时覆盖我的自定义 css

node.js - 握手nodeJS之前套接字无法连接

node.js - NodeJS https服务器没有响应

java - 在java中迭代聚合输出

node.js - 使用 mongoose 的 mongodb 连接超时

node.js - 连接已关闭 : Multiple node apps connecting to same MongoDB server using Mongoose

javascript - 在 mx :HTML's iframe (and read it's value cross-domain) 中设置 `top.location === location`

node.js - 使用jade在node.js中渲染html+js页面时,将html作为渲染的文本而不是html