为游戏服务器和相关API服务器设计分布式系统

时间:2017-07-17 15:57:37

标签: api sockets networking architecture protocols

我正在运行一款MMORPG风格游戏的GameServer 从现在起,分布式系统始终包含:

     
  • GameServer本身,用C ++编写  
  • GameServer的数据库服务器,运行MySQL  
  • 运行PHP站点的Web服务器,它只与具有共享访问权限的数据库进行交互。  
  • 用于备份和记录内容的其他随机服务器

整个项目是为了研究目的,因此,现在我想在网络编程方面迈出一步。

现在,我与GameServer通信的唯一方法是通过数据库,这对于用户注册或记录等操作很有效。
我想创建一个直接连接到游戏的API服务器,这可以提供更灵活的方式来提交和接收信息 我想到了一个通过socket连接到GameServer的node.js服务器。它将负责为Web服务器和其他服务提供REST API。 它还关心数据缓存。

我会问:

     
  • 我应该使用TCP还是UDP进行API和游戏服务器之间的通信?交换的数据只是最大几KB的文本。  
  • 为这种迭代实现什么可能是一个很好的协议?或者我应该自己写?  
  • 拥有API服务器的安全问题可能与其自身与游戏之间的连接有关。  
  • 我的系统架构有效吗?什么是更好的方式(更有效,可维护或可用)在两台机器之间进行通信。

1 个答案:

答案 0 :(得分:1)

我会以相反的顺序开始你的问题:

  

我的系统架构有效吗?什么是更好的方式(更多   有效的,可维护的或可用的)两者之间的沟通   机等。

通常,应用程序逻辑(游戏服务器)和数据库之间的分离是很好的第一步。对于真正的分布式系统,您可能需要另外考虑:可伸缩性(如果您拥有单个服务器无法处理的众多播放器会发生什么)和弹性(当游戏服务器或数据库机器死亡时您的游戏会发生什么)。对于这些主题,您需要考虑基于群集的系统。例如,如果要创建游戏服务器群集,可以使用kubernetes等基础结构来部署三个游戏服务器而不是一个游戏服务器。这将要求您的游戏服务器设计实现为无状态服务(数据库中唯一的状态存在)。例如,您的数据库可以类似地部署为kubernetes基础架构上的cockroachDB集群。

另外 - 关于使用Node.js的一些说法 - 这对于开发来说当然容易/方便,但不是最快的解决方案。我还建议调查go语言(golang),这对于这些任务非常有用,并且与C ++的速度大致相同。与C的连接也很棒。

  

与API服务器相关的安全问题可能是什么?   本身与游戏之间的联系。

您可能需要考虑使用API-Gateway来保护对游戏服务器和数据库的访问。 API网关还可以帮助缓存,记录,速率限制等。

  

为这种迭代实现什么可能是一个很好的协议?   或者我应该自己编写吗?

我通常会使用更高级别的协议,例如http。为了加快沟通速度,请查看Flat Buffers - 它可能是游戏的首选解决方案,可以直接在多种语言中使用。很可能不需要编写自己的协议。

  

我应该使用TCP还是UDP进行API和API之间的通信   游戏服务器?交换的数据只是最多几KB的文本。

见上一个答案。