`

QQ游戏百万人在线的技术实现)

 
阅读更多

近日在与业内人士讨论时,提到QQ游戏的实现方式并不是我原来所想的那样,于是,今天又认真抓了一下QQ游戏的包,结果确如这位兄弟所言,QQ游戏的架构与我当初所设想的那个架构相差确实不小。下面,我重新给出QQ百万级在线的技术实现方案,并以此展开,谈谈大型在线系统中的负载均衡机制的设计。

  从QQ游戏的登录及游戏过程来看,QQ游戏中,也至少分为三类服务器。它们是:
  第一层:登陆/账号服务器(Login Server),负责验证用户身份、向客户端传送初始信息,从QQ聊天软件的封包常识来看,这些初始信息可能包括“会话密钥”此类的信息,以后客户端与后续服务器的通信就使用此会话密钥进行身份验证和信息加密;
  第二层:大厅服务器(估且这么叫吧, Game Hall Server),负责向客户端传递当前游戏中的所有房间信息,这些房间信息包括:各房间的连接IP,PORT,各房间的当前在线人数,房间名称等等。
  第三层:游戏逻辑服务器(Game Logic Server),负责处理房间逻辑及房间内的桌子逻辑。

  从静态的表述来看,以上的三层结构似乎与我以前写的那篇文章相比并没有太大的区别,事实上,重点是它的工作流程,QQ游戏的通信流程与我以前的设想可谓大相径庭,其设计思想和技术水平确实非常优秀。具体来说,QQ游戏的通信过程是这样的:

  1.由Client向Login Server发送账号及密码等登录消息,Login Server根据校验结果返回相应信息。可以设想的是,如果Login Server通过了Client的验证,那么它会通知其它Game Hall Server或将通过验证的消息以及会话密钥放在Game Hall Server也可以取到的地方。总之,Login Server与Game Hall Server之间是可以共享这个校验成功消息的。一旦Client收到了Login Server返回成功校验的消息后,Login Server会主动断开与Client的连接,以腾出socket资源。Login Server的IP信息,是存放在QQGame\config\QQSvrInfo.ini里的。

  2.Client收到Login Server的校验成功等消息后,开始根据事先选定的游戏大厅入口登录游戏大厅,各个游戏大厅Game Hall Server的IP及Port信息,是存放在QQGame\Dirconfig.ini里的。Game Hall Server收到客户端Client的登录消息后,会根据一定的策略决定是否接受Client的登录,如果当前的Game Hall Server已经到了上限或暂时不能处理当前玩家登录消息,则由Game Hall Server发消息给Client,以让Client重定向到另外的Game Hall Server登录。重定向的IP及端口信息,本地没有保存,是通过数据包或一定的算法得到的。如果当前的Game Hall Server接受了该玩家的登录消息后,会向该Client发送房间目录信息,这些信息的内容我上面已经提到。目录等消息发送完毕后,Game Hall Server即断开与Client的连接,以腾出socket资源。在此后的时间里,Client每隔30分钟会重新连接Game Hall Server并向其索要最新的房间目录信息及在线人数信息。

  3.Client根据列出的房间列表,选择某个房间进入游戏。根据我的抓包结果分析,QQ游戏,并不是给每一个游戏房间都分配了一个单独的端口进行处理。在QQ游戏里,有很多房间是共用的同一个IP和同一个端口。比如,在斗地主一区,前50个房间,用的都是同一个IP和Port信息。这意味着,这些房间,在QQ游戏的服务器上,事实上,可能是同一个程序在处理!!!QQ游戏房间的人数上限是400人,不难推算,QQ游戏单个服务器程序的用户承载量是2万,即QQ的一个游戏逻辑服务器程序最多可同时与2万个玩家保持TCP连接并保证游戏效率和品质,更重要的是,这样可以为腾讯省多少money呀!!!哇哦!QQ确实很牛。以2万的在线数还能保持这么好的游戏品质,确实不容易!QQ游戏的单个服务器程序,管理的不再只是逻辑意义上的单个房间,而可能是许多逻辑意义上的房间。其实,对于服务器而言,它就是一个大区服务器或大区服务器的一部分,我们可以把它理解为一个庞大的游戏地图,它实现的也是分块处理。而对于每一张桌子上的打牌逻辑,则是有一个统一的处理流程,50个房间的50*100张桌子全由这一个服务器程序进行处理(我不知道QQ游戏的具体打牌逻辑是如何设计的,我想很有可能也是分区域的,分块的)。当然,以上这些只是服务器作的事,针对于客户端而言,客户端只是在表现上,将一个个房间单独罗列了出来,这样作,是为便于玩家进行游戏以及减少服务器的开销,把这个大区中的每400人放在一个集合内进行处理(比如聊天信息,“向400人广播”和“向2万人广播”,这是完全不同的两个概念)。

  4.需要特别说明的一点。进入QQ游戏房间后,直到点击某个位置坐下打开另一个程序界面,客户端的程序,没有再创建新的socket,而仍然使用原来大厅房间客户端跟游戏逻辑服务器交互用的socket。也就是说,这是两个进程共用的同一个socket!不要小看这一点。如果你在创建桌子客户端程序后又新建了一个新的socket与游戏逻辑服务器进行通信,那么由此带来的玩家进入、退出、逃跑等消息会带来非常麻烦的数据同步问题,俺在刚开始的时候就深受其害。而一旦共用了同一个socket后,你如果退出桌子,服务器不涉及释放socket的问题,所以,这里就少了很多的数据同步问题。关于多个进程如何共享同一个socket的问题,请去google以下内容:WSADuplicateSocket。

  以上便是我根据最新的QQ游戏抓包结果分析得到的QQ游戏的通信流程,当然,这个流程更多的是客户端如何与服务器之间交互的,却没有涉及到服务器彼此之间是如何通信和作数据同步的。关于服务器之间的通信流程,我们只能基于自己的经验和猜想,得出以下想法:

  1.Login Server与Game Hall Server之前的通信问题。Login Server是负责用户验证的,一旦验证通过之后,它要设法让Game Hall Server知道这个消息。它们之前实现信息交流的途径,我想可能有这样几条:a. Login Server将通过验证的用户存放到临时数据库中;b. Login Server将验证通过的用户存放在内存中,当然,这个信息,应该是全局可访问的,就是说所有QQ的Game Hall Server都可以通过服务器之间的数据包通信去获得这样的信息。

  2.Game Hall Server的最新房间目录信息的取得。这个信息,是全局的,也就是整个游戏中,只保留一个目录。它的信息来源,可以由底层的房间服务器逐级报上来,报给谁?我认为就如保存的全局登录列表一样,它报给保存全局登录列表的那个服务器或数据库。

  3.在QQ游戏中,同一类型的游戏,无法打开两上以上的游戏房间。这个信息的判定,可以根据全局信息来判定。

  以上关于服务器之间如何通信的内容,均属于个人猜想,QQ到底怎么作的,恐怕只有等大家中的某一位进了腾讯之后才知道了。呵呵。不过,有一点是可以肯定的,在整个服务器架构中,应该有一个地方是专门保存了全局的登录玩家列表,只有这样才能保证玩家不会重复登录以及进入多个相同类型的房间。

  在前面的描述中,我曾经提到过一个问题:当登录当前Game Hall Server不成功时,QQ游戏服务器会选择让客户端重定向到另位的服务器去登录,事实上,QQ聊天服务器和MSN服务器的登录也是类似的,它也存在登录重定向问题。

  那么,这就引出了另外的问题,由谁来作这个策略选择?以及由谁来提供这样的选择资源?这样的处理,便是负责负载均衡的服务器的处理范围了。由QQ游戏的通信过程分析派生出来的针对负责均衡及百万级在线系统的更进一步讨论,将在下篇文章中继续。

  在此,特别感谢网友tilly及某位不便透露姓名的网友的讨论,是你们让我决定认真再抓一次包探个究竟。

分享到:
评论

相关推荐

    QQ游戏合并源码

    1. **游戏开发基础**:QQ游戏是腾讯公司推出的一款在线休闲竞技平台,涵盖了许多不同类型的游戏,如麻将、斗地主、泡泡龙等。开发这样的游戏需要掌握多种技术,包括但不限于图形设计、动画制作、音效处理、网络编程...

    易语言解除QQ游戏大厅多开限制源码

    QQ游戏大厅是由腾讯公司开发的一款集休闲、竞技于一体的在线游戏平台,它通常会对同一账号在同一设备上的登录数量进行限制,以保证游戏环境的公平性和服务器的稳定。然而,有些用户可能有需求或兴趣去解除这种多开...

    仿QQ游戏大厅的联机五子棋

    【标题】"仿QQ游戏大厅的联机五子棋"是一个基于C/S(客户端/服务器)架构的在线游戏项目,其目标是复制QQ游戏大厅的五子棋对战功能,让玩家可以实现实时的多人在线对弈。这个项目的核心在于运用了Java编程语言的关键...

    联机五子棋游戏大厅(仿QQ游戏)

    总的来说,“联机五子棋游戏大厅(仿QQ游戏)”项目综合运用了Java的Socket、多线程和Swing技术,实现了多人在线对战的五子棋游戏功能。这不仅锻炼了开发者的编程技能,也为玩家带来了便利和乐趣。在未来,随着技术的...

    c++实现的仿QQ贪吃蛇大作战多人联机游戏.zip

    本项目是基于C++语言实现的一个仿QQ贪吃蛇大作战的多人联机游戏,它巧妙地结合了C++的底层控制力和现代编程技术,为玩家提供了一个刺激有趣的在线对战平台。游戏的核心在于服务端与客户端的高效通信,这里主要采用...

    易语言源码易语言QQ游戏多开源码.rar

    QQ游戏作为一款广受欢迎的在线游戏平台,其背后的开发工作包含了大量的技术细节。在易语言的源码中,我们可以看到如何处理玩家的输入、如何同步游戏状态、如何优化游戏性能等内容。此外,游戏的界面设计、音效处理、...

    zhipai.rar_qq游戏_框架代码_游戏平台_纸牌

    【标题】"zhipai.rar" 是一个包含QQ游戏平台上纸牌对战框架代码的压缩文件,主要聚焦于游戏开发的框架构建以及人工智能系统的基础实现。这个资源对于想要学习或理解游戏开发,尤其是纸牌类游戏逻辑的人来说,具有...

    C#仿真QQ游戏火拼俄罗斯源码

    本文将深入探讨一款用C#语言开发的仿真QQ游戏火拼俄罗斯源码,基于TCP/IP协议,实现了多人在线同时对战的功能。 首先,我们要理解C#作为编程语言在游戏开发中的优势。C#是Microsoft推出的一种面向对象的编程语言,...

    C#开发的QQ机器人,适用于任意版本

    在信息技术领域,QQ机器人是一种利用编程语言,如C#,构建的自动化程序,它可以模拟人类在QQ聊天平台上的交互行为。C#是一种强大的面向对象的编程语言,由微软公司开发,广泛应用于Windows桌面应用、Web应用以及游戏...

    QQ机器人代码

    在编程实现QQ机器人的过程中,常见的技术栈可能包括Python、Node.js、C#等语言。例如,Python有一个名为`qqbot`的库,提供了方便的接口用于操作QQ机器人。开发者需要申请一个QQ开发者账号,获取到AppID和AppKey,...

    易语言源码易语言解除QQ游戏大厅多开限制源码

    ### 易语言源码解析:解除QQ游戏...总之,通过易语言实现解除QQ游戏大厅多开限制不仅涉及技术层面的挑战,还需要考虑到法律及道德层面的问题。开发者在进行此类操作时应当慎重评估,确保自己的行为符合相关规定和标准。

    基于MFC开发的QQ游戏大厅的客户端界面

    综上所述,基于MFC开发的QQ游戏大厅客户端界面涉及到多方面的技术和设计原则。从控件的使用到网络通信的实现,再到用户体验的优化,每一个环节都需要开发者深入理解和熟练掌握MFC及相关技术。这样的项目不仅能提升...

    (最好用的)QQ机器人

    二、QQ机器人的技术实现 1. 自然语言处理(NLP):通过深度学习技术,理解并解析用户输入的文本,进行有效的回应。 2. 事件驱动编程:当特定事件(如新消息、新人加入等)发生时,机器人会触发相应的行为。 3. ...

    PUN-Tutorial-多人在线游戏教程译文.pdf

    《PUN-Tutorial-多人在线游戏教程译文.pdf》是基于Photon实时多人游戏开发框架的一份详尽教程,特别适合那些在Unity引擎中构建多人在线游戏的开发者。这份译文为英语阅读困难的开发者提供了极大的便利,使得他们也能...

    强大的QQ机器人

    QQ机器人的核心原理是通过编程技术,让程序能够理解和处理QQ协议,实现与QQ服务器的交互。这通常涉及到网络编程、协议解析、多线程技术等计算机科学基础知识。其中,QQ协议的理解和实现是QQ机器人的核心技术之一,...

    QQ c#实现qq基本功能

    【标题】:“QQ c#实现qq基本功能” 在IT领域,使用编程语言来实现特定软件的功能是一种常见的实践。本项目聚焦于使用C#这门语言来实现QQ的基本功能。C#,由微软开发,是一种面向对象的编程语言,广泛应用于Windows...

    商业编程-源码-类似QQ游戏大厅导航的树型控件.zip

    其次,商业编程涉及到的不仅仅是技术实现,还需要考虑软件的商业模式、版权和许可问题。由于这个项目被标记为“商业编程”,意味着它的设计和实现可能是为了满足商业需求,可能涉及商业软件的开发,这需要遵守特定的...

    html5实现的仿手机QQ拆红包游戏源码.zip

    HTML5是一种先进的网页开发技术,它为网页应用带来了丰富的交互性和多媒体支持,使得开发者能够创建出功能强大且吸引人的在线体验。在这个“html5实现的仿手机QQ拆红包游戏源码.zip”压缩包中,我们可以预见到一个...

Global site tag (gtag.js) - Google Analytics