我有一个可以在几个实例上运行的游戏服务器。
世界1,世界2,世界3
每个世界都是一台运行在不同IP地址上的服务器。
有游戏应具备的清单:
我可以想到两种实现方法:
方法1-登录服务器TCP / IP
创建一个中间人服务器。当客户端连接到某个世界时,该世界服务器将发送登录请求数据包以输入所输入的用户凭据,并且登录服务器将检查数据库并响应身份验证结果,如果成功,则将在用户名中授权该用户。世界。
登录服务器将始终使用在线玩家列表,每个玩家的状态,他所处的世界等等来更新所有世界。
方法2
与方法1 相同,但代替登录服务器,使用HTTP API服务器,并使用Redis服务器通过事件相互更新。 我为什么认为这更好?因为将Web应用程序集成到游戏中会更加容易,所以允许用户通过Web应用程序进行连接和彼此聊天。
要在方法1中做到这一点,您需要向TCP / IP登录服务器添加一个新隧道以支持WebSocket连接。
对不起,图纸不好。
方法2是否可行?您认为哪种方法更好?如果还有其他方法可以考虑?
答案 0 :(得分:5)
您还没有考虑很多因素,但是我将尝试给出一个普遍的答案。执行此操作的典型方法是使用负载平衡器,该负载平衡器在后端的计算机(世界)之间分配初始连接。您没有说用户是应该连接到特定的世界,还是只是任何一个。有多种方法可以使负载均衡器具有粘性,但如果用户在登录时选择自己的世界,则可能需要其他方法。无论如何,它可能看起来像这样:
然后,您将使用数据库获取登录凭据,每个世界都将对每个登录进行验证。然后,您将使用Redis(可以使用数据库,但是Redis更快)来跟踪当前用户,他们所处的世界等。您还可以使用它来发送消息,或者可以将消息队列(带有源/沉入每个世界)。此方法也非常可扩展。如果您需要更多世界,只需在负载均衡器后面添加更多完全相同的计算机,而无需更改任何代码。
正如我所说,这只是一个普遍的答案,您情况的具体细节可能会使其他方法更具吸引力。
答案 1 :(得分:0)
我使用了类似的方法,例如第二种方法。我有一项服务,该服务使用他们的gmail帐户登录用户,登录服务将存储在数据库中的用户数据发送到gmail连接器服务,该服务创建了身份验证URL,并将其发送回登录服务和登录名服务将URL发送到前端以在弹出窗口中打开身份验证URL,因此从我的经验来看,redis非常棒而且非常快捷。
要发送消息,每个玩家都可以订阅唯一主题,其他玩家可以使用Redis pub/sub为该特定玩家发送有关该主题的消息,并且所有玩家登录后即可订阅全局主题私人消息和全局消息。
很容易将活跃玩家的ID缓存在Redis中,并在每个特定时间段或在发生特定事件(例如登录或注销系统)时可以使用哈希映射将用户标记为活跃或不活跃{{3} }。
Redis非常快,您可以将其用于HMSET。
但是请注意,redis已全部存储在内存中,因此您必须小心并牢记有关benchmark it的容错能力。