我是第一次使用 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 会因套接字请求而重载,并且我不知道最好的解决方案。
- 我可以将所有 session 、用户和游戏对象保存在套接字上以直接访问它吗?没有 mongo 请求
- 如果我这样做,我该如何处理游戏更新? (如果其他玩家移动等......)
谢谢大家的帮助,我很抱歉我的英语不好:/
最佳答案
您可以将该用户的数据保存在该套接字上下文的内存中。 (基于套接字的通信相对于基于单独请求的通信的一个主要优点。)如果您正在运行多个 Node 服务器实例,那么如果同一用户由两个不同的服务器更新,则可能会导致问题。您可能希望有一个 mongodb 字段作为该玩家的“最后更新”日期,您可以对其进行索引并仅查询该字段,而不是提取所有数据。当您更新播放器时,更新该字段,后续请求将使缓存失效。像这样的多服务器通信的另一个选项是 op-log tailing。
关于javascript - 谁来正确管理套接字上的 mongodb 数据(服务器端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27021886/