服务器架构-Redis与Socket服务器

时间:2019-03-27 11:26:17

标签: java http server redis architecture

我有一个可以在几个实例上运行的游戏服务器。

世界1,世界2,世界3

每个世界都是一台运行在不同IP地址上的服务器。

有游戏应具备的清单:

  • 与游戏的连接,对用户进行身份验证。
  • 能够查看所有已连接的玩家,显示每个玩家所连接的世界。
  • 即使玩家已连接到其他世界服务器,也可以向玩家发送消息。
  • 能够向所有服务器发送全局消息。

我可以想到两种实现方法:

方法1-登录服务器TCP / IP

  • 创建一个中间人服务器。当客户端连接到某个世界时,该世界服务器将发送登录请求数据包以输入所输入的用户凭据,并且登录服务器将检查数据库并响应身份验证结果,如果成功,则将在用户名中授权该用户。世界。

  • 登录服务器将始终使用在线玩家列表,每个玩家的状态,他所处的世界等等来更新所有世界。

  • 当两个玩家位于不同的世界中时,他们从玩家X向玩家Y发送消息时,世界服务器将向登录服务器发送消息,登录服务器会将消息传递给该玩家的目标世界,因此另一个玩家世界将会收到消息。

IMG]([![enter image description here

方法2

方法1 相同,但代替登录服务器,使用HTTP API服务器,并使用Redis服务器通过事件相互更新。 我为什么认为这更好?因为将Web应用程序集成到游戏中会更加容易,所以允许用户通过Web应用程序进行连接和彼此聊天。

要在方法1中做到这一点,您需要向TCP / IP登录服务器添加一个新隧道以支持WebSocket连接。

enter image description here

对不起,图纸不好。

方法2是否可行?您认为哪种方法更好?如果还有其他方法可以考虑?

2 个答案:

答案 0 :(得分:5)

您还没有考虑很多因素,但是我将尝试给出一个普遍的答案。执行此操作的典型方法是使用负载平衡器,该负载平衡器在后端的计算机(世界)之间分配初始连接。您没有说用户是应该连接到特定的世界,还是只是任何一个。有多种方法可以使负载均衡器具有粘性,但如果用户在登录时选择自己的世界,则可能需要其他方法。无论如何,它可能看起来像这样:

Block Diagram with Load Balancer

然后,您将使用数据库获取登录凭据,每个世界都将对每个登录进行验证。然后,您将使用Redis(可以使用数据库,但是Redis更快)来跟踪当前用户,他们所处的世界等。您还可以使用它来发送消息,或者可以将消息队列(带有源/沉入每个世界)。此方法也非常可扩展。如果您需要更多世界,只需在负载均衡器后面添加更多完全相同的计算机,而无需更改任何代码。

正如我所说,这只是一个普遍的答案,您情况的具体细节可能会使其他方法更具吸引力。

答案 1 :(得分:0)

我使用了类似的方法,例如第二种方法。我有一项服务,该服务使用他们的gmail帐户登录用户,登录服务将存储在数据库中的用户数据发送到gmail连接器服务,该服务创建了身份验证URL,并将其发送回登录服务和登录名服务将URL发送到前端以在弹出窗口中打开身份验证URL,因此从我的经验来看,redis非常棒而且非常快捷。

要发送消息,每个玩家都可以订阅唯一主题,其他玩家可以使用Redis pub/sub为该特定玩家发送有关该主题的消息,并且所有玩家登录后即可订阅全局主题私人消息和全局消息。

很容易将活跃玩家的ID缓存在Redis中,并在每个特定时间段或在发生特定事件(例如登录或注销系统)时可以使用哈希映射将用户标记为活跃或不活跃{{3} }。

Redis非常快,您可以将其用于HMSET

  

但是请注意,redis已全部存储在内存中,因此您必须小心并牢记有关benchmark it的容错能力。