gpt4 book ai didi

c# - 高性能 WebSocket 游戏服务器的单点登录?

转载 作者:搜寻专家 更新时间:2023-10-30 20:38:11 33 4
gpt4 key购买 nike

我正在使用 WebSocket 协议(protocol)(通过 WebSocketSharp)开发 C# 游戏服务器。目前,每当用户登录游戏时,我都会创建一个 token 并将其添加到 ConcurrentDictionary 中。现在我需要一个用户一次只能登录一次,而且将来服务器程序可能有多个实例运行在相同或不同的物理机上,我需要从内存迁移到数据库。

但是,我需要为每个 WebSocket 请求进行非常高性能的身份验证验证(我有一个类似 session 的 session 来保存 token )。因此,我打算将 token 从数据库缓存到内存(旧的 ConcurrentDictionary),因为不能为每个请求检查数据库。

但是现在我遇到了另一个同步问题。我有两个想法:

  • 防止第二台设备在该帐户的 token 已存在后登录。当用户注销时, token 将被销毁。但是,它是不可靠的,因为用户可能无法正确注销(例如网络问题)。在这种情况下,用户帐户可能会在 session / token 生命周期内卡住。如果 token 生命周期太短而无法避免问题,那么我的服务器必须过于频繁地检查数据库。
  • 赋予用户再次登录的能力,如果已经有 token ,用户可以选择其他登录,因此第一个用户可能会在游戏中被踢,然后取而代之的是新游戏(这种行为类似于 Steam 游戏)。但是,如果不经常检查数据库,服务器如何知道第一个 token 在到期时间之前被踢出?

请分享一些关于此问题的经验和/或任何适当的解决方案。

最佳答案

如何设置集群,使用户始终被定向到同一台服务器(如果已启动),直到他们的 session 超时。所有负载均衡器都支持粘性 session 。

使用粘性会导致给定用户始终访问同一台服务器。因此,您可以使用专门的内存机制来验证身份验证 token 。如果服务器崩溃,LB 通常会知道服务器已关闭并将数据包定向到另一台服务器。该服务器应该能够检测到身份验证票证无效(在该服务器上)并指示用户重新进行身份验证。据推测,这是可以的,因为正在进行的游戏状态在服务器崩溃时会丢失。

关于c# - 高性能 WebSocket 游戏服务器的单点登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31619252/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com