跳转至

7 QQ 游戏百万人同时在线服务器架构实现

QQ 游戏于前几日终于突破了百万人同时在线的关口,向着更为远大的目标迈进,这让其它众多传统的棋牌休闲游戏平台黯然失色,相比之下,联众似乎已经根本不是 QQ 的对手,因为 QQ 除了这 100 万的游戏在线人数外,它还拥有 3 亿多的注册量(当然很多是重复注册的)以及 QQ 聊天软件 900 万的同时在线率,我们已经可以预见未来由 QQ 构建起来的强大棋牌休闲游戏帝国。

服务器程序,其可承受的同时连接数目是有理论峰值的,在实际应用中,能达到一万人的同时连接并能保证正常的数据交换已经是很不容易了,通常这个值都在 2000 到 5000 之间,据说 QQ 的单台服务器同时连接数目也就是在这个值这间。

如果要实现 2000 到 5000 用户的单服务器同时在线,是不难的。在 windows 下,比较成熟的技术是采用 IOCP--- 完成端口。只要运用得当,一个完成端口服务器是完全可以达到 2K 到 5K 的同时在线量的。但,5K 这样的数值离百万这样的数值实在相差太大了,所以,百万人的同时在线是单台服务器肯定无法实现的。

要实现百万人同时在线,首先 要实现一个比较完善的完成端口服务器模型,这个模型要求至少可以承载 2K 到 5K 的同时在线率(当然,如果你 MONEY 多,你也可以只开发出最多允许 100 人在线的服务器)。在构 建好了基本的完成端口服务器之后,就是有关服务器组的架构设计了。之所以说这是一个 服务器组,是因为它绝不仅仅只是一台服务器,也绝不仅仅是只有一种类型的服务器。

简单地说,实现百万人同时在线的服务器模型应该是:登陆服务器+大厅服务器+房间服务器。当然,也可以是其它的模型,但其基本的思想是一样的。下面,我将逐一介绍这三类服务器的各自作用。

/ 1 /

登陆服务器:一般情况下,我们会向玩家开放若干个公开的登陆服务器,就如 QQ 登陆时让你选择的从哪个 QQ 游戏服务器登陆一样,QQ 登陆时让玩家选择的六个服务器入口实际上就是登陆服务器。登陆服务器主要完成负载平衡的作用。详细点说就是,在登陆服务器的背后,有 N 个大厅服务器,登陆服务器只是用于为当前的客户端连接选择其下一步应该连接到哪个大厅服务器,当登陆服务器为当前的客户端连接选择了一个合适的大厅服务器后,客户端开始根据登陆服务器提供的信息连接到相应的大厅上去,同时客户端断开与登陆服务器的连接,为其他玩家客户端连接登陆服务器腾出套接字资源。

设计登陆服务器 时,至少应该有以下 功能:N 个大厅服务器的每一个大厅服务器都要与所有的登陆服务器保持连接,并实时地把本大厅服务器当前的同时在线人数通知给各个登陆服务器,这其中 包括:用户进入时的同时在线人数增加信息以及用户退出时的同时在线人数减少信息。这里的各个大厅服务器同时在线人数信息就是登陆服务器为客户端选择某个大厅让其登陆的依据。举例 来说,玩家 A 通过登陆服务器 1 连接到登陆服务器,登陆服务器开始为当前玩家在众多的大厅服务器中根据哪一个大厅服务器人数比较少来选择一个大厅,同时把这个大厅的连接 IP 和端口发给客户端,客户端收到这个 IP 和端口信息后,根据这个信息连接到此大厅,同时,客户端断开与登陆服务器之间的连接,这便是用户登陆过程中,在登陆服务器这一块的处理流程。

/ 2 /

大厅服务器:是普通玩家看不到的服务器,它的连接 IP 和端口信息是登陆服务器通知给客户端的。也就是说,在 QQ 游戏的本地文件中,具体的大厅服务器连接 IP 和端口信息是没有保存的。大厅服务器的主要作用 是向玩家发送游戏房间列表信息。

这些 信息 包括:

  • 每个游戏房间的类型
  • 名称
  • 在线人数
  • 连接地址以及其它如游戏帮助文件 URL 的信息

界面上看的话,大厅服务器就是我们输入用户名和密码并校验通过后进入的游戏房间列表界面。

大厅服务器,主要有以下 功能

  1. 一是向当前玩家广播各个游戏房间在线人数信息;
  2. 二是提供游戏的版本以及下载地址信息;
  3. 三是提供各个游戏房间服务器的连接 IP 和端口信息;
  4. 四是提供游戏帮助的 URL 信息;
  5. 五是提供其它游戏辅助功能。

但在这众多的功能中,有一点是 最为核心 的,即:为玩家提供进入具体的游戏房间的通道,让玩家顺利进入其欲进入的游戏房间。玩家根据各个游戏房间在线人数,判定自己进入哪一个房间,然后双击服务器列表中的某个游戏房间后玩家开始进入游戏房间服务器。

/ 3 /

游戏房间服务器:具体地说就是如“斗地主 1”,“斗地主 2”这样的游戏房间。游戏房间服务器才是具体的负责执行游戏相关逻辑的服务器。这样的 游戏逻辑分为两大类

  • 第一类是 通用的游戏房间逻辑,如:进入房间,离开房间,进入桌子,离开桌子以及在房间内说话等;
  • 第二类是 游戏桌子逻辑,这个就是各种不同类型游戏的主要区别之处了,比如斗地主中的叫地主或不叫地主的逻辑等,当然,游戏桌子逻辑里也包括有通用的各个游戏里都存在的游戏逻辑,比如在桌子内说话等。

总之,游戏房间服务器才是真正负责执行游戏具体逻辑的服务器。

这里提到的 三类服务器,均采用的是完成端口模型,每个服务器最多连接数目是 5000 人,但是,我在游戏房间服务器上作了逻辑层的限定,最多只允许 300 人同时在线。其他两个服务器仍然允许最多 5000 人的同时在线。

如果按照这样的结构来设计,那么 要实现百万人的同时在线就应该是这样:

  • 首先是大厅,1000000/5000=200。也就是说,至少要 200 台大厅服务器,但通常情况下,考虑到实际使用时服务器的处理能力和负载情况,应该至少准备 250 台左右的大厅服务器程序。
  • 另外,具体的各种类型的游戏房间服务器需要多少,就要根据当前玩各种类型游戏的玩家数目分别计算了,比如斗地主最多是十万人同时在线,每台服务器最多允许 300 人同时在线,那么需要的斗地主服务器数目就应该不少于:100000/300=333,准备得充分一点,就要准备 350 台斗地主服务器。
  • 除正常的玩家连接外,还要考虑到:对于登陆服务器,会有 250 台大厅服务器连接到每个登陆服务器上,这是始终都要保持的连接;

而对于大厅服务器而言,如果仅仅有斗地主这一类的服务器,就要有 350 多个连接与各个大厅服务器始终保持着。所以从这一点看,结构在某些方面还存在着需要改进的地方,但 核心思想是:尽快地提供用户登陆的速度,尽可能方便地让玩家进入游戏中。