我有这个REST的游戏,你可以加入多人,并自动被分配到一个大厅,并与世界各地的人玩。
当player连接到multiplayer时,它们会向API /connectToGame发送一个请求,其中包含头中的授权令牌。
1.我把他们的sessionId从承载令牌(令牌是通过另一条路径提供给玩家),首先我找到一个可用的大厅,空的播放器插槽,我把他们的sessionId推到那个大厅的会话数组(让他们的sid是1002783919)
在这之后,大厅看起来是这样的:
{
"_id": "63495c6ff4de52ec18eb4978",
"lobbyId": "e3504041-5eb6-4036-a23a-14ff815c1d45",
"sessions": [
1002783919
],
}2.我为玩家创建一个会话对象,其中包含他们的sid和player信息,并将lobbyId从他们加入的大厅分配给player对象。
{
"_id": "63495e81e2aab91b8d2f9823",
"sessionId": 1002783919,
"lobbyId": "e3504041-5eb6-4036-a23a-14ff815c1d45",
"player": {
"avatar": 372,
"name": "TEST",
"onlinescore": 1,
"country": 8519
},
"updatedAt": "2022-10-14T12:56:15.373+00:00"
}每隔5秒,游戏就会点击服务器,我会将玩家的会话updatedAt更新为Date.now(),这样我就知道这个会话仍然存在,并且正在被使用。
在这里之前没有问题,我只是想给你们看看这个过程
如果玩家想离开多人游戏,游戏就会发布/leaveGame,里面有他们的会话in。当发生这种情况时,我只需取下他们的sid,从大厅中删除sid,并删除他们的会话条目。
但有时,玩家可能只是意外地关闭了他们的游戏,这将不会给游戏留下任何机会来完成leaveGame的要求。因此,会话条目和大厅中的sid将永远停留在数据库中。
我在想一种方法,我可以删除死球员的入口和他们的游说sid从数据库和有人告诉我使用节点cron和检查每30秒死亡的球员,并删除他们。如果会话的updatedAt在1分钟内没有更新(因为玩家每5秒就会有一个服务器),您就可以判断会话是否还活着。你们认为这是一种有效的方法还是有更好的方法来做到这一点?
发布于 2022-10-14 15:35:56
一种解决方案似乎是在字段updatedAt上添加TTL索引,并设置一些您想要的时间,比如1分钟,这样如果updatedAt值比当前时间早-1分钟,mongo将自动删除它。
https://stackoverflow.com/questions/74070265
复制相似问题