c++分布式游戏服务器架构设计

一、游戏服务器架构介绍

1.1 游戏服务器介绍

游戏服务器的主要作用是将玩家聚在一起,让玩家之间能相互可见,并提供能够使玩家与玩家相互交互的功能。需要连接服务器的游戏称之为网络游戏,网络游戏比单机游戏更受大众的欢迎。真实玩家之间技能操作的较量,真实队友之间完美的配合,这是网络游戏竞技的魅力所在。
本文设计的游戏服务器可以灵活的扩展服务。除了基本的对战,匹配服务,还可能根据需求扩展排位,邮件,好友等服务。服务器也可以通过增加每种服务部署的数量来提高并发能力。下面就来介绍如何实现高并发可扩展游戏服务器。

1.2 服务的划分

在分布式服务器架构中一般会根据功能对服务器进行划分,例如

  1. 管理与客户端TCP连接的 connsvr
  2. Redis数据库代理服务器 dbsvr
  3. MYSQL数据库代理服务器 mysqlsvr
  4. 主要逻辑(负责修改玩家数据)服务器 mainsvr
  5. 游戏对局服务器 gamesvr
  6. 游戏匹配服务器 matchsvr

    根据游戏种类或需求的不同,可能还会划分出其它的一些服务。

像这样按照功能对服务器进行划分,称为服务器的横向扩展。为什么要对服务器进行划分?原因就像函数或类要职责单一一样。如果所有功能在一个服务中,其中某个功能出了bug导致服务奔溃就会使整个服务不可用。
相较于服务器的横向扩展,同一服务部署多个,叫做服务器的纵向扩展

1.3 服务与服务之间的通讯

为什么要有服务之间的通讯? 当客户端通过TCP将消息发送到服务端后,服务端内部服务与服务之间通过协作共同完成客户端的请求。
例如图1.1 处理一个客户端发来的登录消息。在这个例子中,消息的流程如下:

  1. Client将消息通过TCP发送到connsvr服务。
  2. connsvr根据消息的cmd将消息转发到对应的服务,登录消息对应的服务是mainsvr
  3. mainsvr去数据库dbsvr拉去玩家数据
  4. dbsvr返回数据原路返回给mainsvr
  5. mainsvr处理完数据后原路返回给connsvr
  6. connsvr将消息的回包通过原来的TCP连接返回给Client
    消息处理完成。

图1.1
图1.1

服务与服务之间怎么通讯?这里的一个服务本质就是一个进程,所以我们要讨论的实际上就是进程之间的通讯。
我们将从以下几点去讨论服务之间的通讯:

  • 唯一标识每个进程(服务的实例)。

这里所说的进程标识并不是在一台主机上操作系统为每个进程在启动时分配的唯一标识。而是在多个主机上部署多个服务时,为了让这些服务相互通讯,而分配的唯一标识。

在分布式服务器中,需要唯一标识每一个实例。每个进程都有一个自己的唯一标识,这样在发送消息的时候才能通过唯一标识找到目标进程,就像每个电脑在网络中都有一个唯一的ip一样。
如何构造这个唯一标识。这里提供一种标识方式:zone.group.server_type.instance_id。前面zone表示大区,group表示分组,server_type表示进程的服务类型,instance_id是为了区分同一服务类型的标号。将这些有实际意义的信息编入标识中,在消息转发的时候可以提供更多的转发策略。

  • 通过什么方式通讯。

图1.2
在这里插入图片描述
图1.3
在这里插入图片描述

进程之间通讯的方式可以是直接通讯,可以是通过一个消息转发中心去间接通讯。如图1.2所示,直接通讯的缺点是一个进程需要与每一个进程建立连接,这样所建立的连接个数是n x n。对于单个进程来说需要维护n个连接,如果在同一台主机上部署多个进程,那么这个主机的连接资源消耗将会是n的数倍。一组服务器超过一千个进程时,单个主机的连接数可能上万,还没开始真正提供服务估计主机资源就消耗了大半。所以我们只能将目光转移到间接通讯上来。如图1.3,间接通讯是所有进程连上消息转发中心,消息转发中心负责将消息发送给目标服务器,这样的通讯方式只需为每个进程建立一个到消息转发中心的连接,这样建立的连接数是n。但是这个通讯模型的问题在于,消息过多时消息转发中心繁忙而成为服务器性能瓶颈。所以根据服务的增加,消息转发中心也会进行分布式部署。

  • 使用什么工具通讯。

推荐使用MQ实现消息转发中心的功能。而不是手动实现消息转发:新建一个转发服务,所有服务使用TCP连接到转发服务。因为MQ为多种语言提供了客户端。假如服务都是用C++开发的,但如果有一个服务使用其他语言可以更好更快的开发,这时使用MQ会比使用TCP门槛更低更快捷,也不需要处理分包粘包。MQ的优势在于,其他语言可以很方便的接入,以及它的持久化和后台可视化数据统计。

  • 消息的发送

所有进程的标识会作为每个进程的配置,即每个进程知道所有进程标识。

所有进程的进程标识是服务启动前根据配置文件生成,并作为所有服务启动时的配置被加载。

  • 15
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值