`

大型在线系统实现的关键

阅读更多
负载均衡--大型在线系统实现的关键(上篇)(再谈QQ游戏百万人在线的技术实现)
分类: 架构、协议与网络 2005-06-12 21:23 21133人阅读 评论(4) 收藏 举报
游戏qq负载均衡server服务器login
本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载,但任何对本文的引用都须注明作者、出处及此声明信息。谢谢!!

  要了解此篇文章中引用的本人写的另一篇文章,请到以下地址:
  http://blog.csdn.net/sodme/archive/2004/12/12/213995.aspx
  以上的这篇文章是早在去年的时候写的了,当时正在作休闲平台,一直在想着如何实现一个可扩充的支持百万人在线的游戏平台,后来思路有了,就写了那篇总结。文章的意思,重点在于阐述一个百万级在线的系统是如何实施的,倒没真正认真地考察过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及某位不便透露姓名的网友的讨论,是你们让我决定认真再抓一次包探个究竟。
分享到:
评论

相关推荐

    煤矿大型设备在线监测与故障诊断系统的研究

    本文针对煤矿井下大型设备的故障诊断系统进行设计,利用组态王实现故障的在线诊断和信息发布。运用振动传感器和温度传感器对关键设备的滚动轴承进行实时监测,可对事故及时处理和预防,保障人员安全的同时,提高生产效率...

    springboot大型商场应急预案管理系统.zip

    详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有...

    大型非球面在位横向剪切干涉检测系统与关键技术研究

    大型非球面在位横向剪切干涉检测系统与关键技术研究,王起维,孙涛,高精度、定量检测方法和检测系统是实现超精密加工的重要条件,尤其对大型非球面超精密加工,检测技术始终贯穿其中(工艺过程检验

    千万吨级矿井综放开采生产系统保障关键技术

    以大同煤矿集团千万吨矿井群开采实践为基础,研究了高可靠性主煤流运输及洗选系统、千万吨级立井大功率高可靠性提升系统总成技术、矿井及工作面智能化控制技术、基于大数据的设备故障诊断与预知维护技术和大型全液压...

    Java-springboot大型商场应急预案管理系统计算机毕业设计程序.zip

    详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有...

    大型视频监控系统的技术要点

    随着城市治安系统、行业治安系统的建设,我们可以看到这些大型的监控系统有着一些共同的特点:以平台为核心,以网络为纽带;接入多家不同的设备,实现互联互通;安防和业务应用的结合越来越紧密。针对这几个特点,...

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    《大型分布式网站架构设计与实践》主要介绍了大型分布式网站架构所涉及的一些技术细节,包括SOA架构的实现、互联网安全架构、构建分布式网站所依赖的基础设施、系统稳定性保障和海量数据分析等内容;深入地讲述了...

    大型煤制烯烃工程蒸汽动力系统研究

    为了解决煤制烯烃工程蒸汽动力系统存在的参数低、煤耗高、备用量大、管网不平衡等影响系统大型化的关键性问题,对运行中系统的数据进行了分析,通过引入超临界燃煤机组和总管制蒸汽管路等方法,提出了一种适应于更大...

    论文研究-大型拼接显示系统的设计方法.pdf

    阐述了大型拼接显示系统设计的关键技术,即主从处理器技术和快速压缩解压技术,并提出了实现单一逻辑屏的概念。通过该系统工程的大量成功安装使用,证明了该设计方案的可行性和稳定性。该系统方案还具有较大的应用...

    基于Java的人事管理系统设计与实现.doc

    基于Java的人事管理系统设计与实现 摘要: 随着计算机的逐步发展、复杂度逐渐变强,人工作业已经无法适应现代的管理,随之取 代的是计算机科学而开发的人事管理系统,而且一个良好的人事管理系统势在必行。...

    校园在线音乐网站系统测试用例及实现.docx

    在开发大型软件的漫长过程中, 面对极其错综复杂的问题, 人的主观认识不可能完全符合客观现实, 与工程密切相关的各类人员之间的通信和配合也不可能完美无缺。 因此, 在软件生命周期的每个阶段都不可避免地会产生...

    银行电子回单系统的设计与实现

    某大型银行电子回单系统的设计与实现 功能架构设计、Java语言和关键实现 回单是记录客户在银行办理了业务的凭据,是核对账务的重 要依据。传统的回单获取方式分为 :一在柜面通过人工打印,这 种方式增加了柜面的...

    关于智能家居网关综合系统的设计与实现.docx

    居室传感器与家用电器的反馈控制系统实现温湿度节点与空调扇及加湿器等居室温湿度自动调节、光线节点与窗帘/照明灯的光线自动调节、红外转换器代替多个遥控器的红外控制等。(4)系统设置:支持离家、居家、自由三种...

    停车场管理系统的设计与实现方案.docx

    停车功能由相应建筑物的合理设计满足,管理部份则由停车场管理系统实现。 根据不同类型建筑工程的管理标准和服务等级、服务对象的不同,停车场管理系统常分为大型停车场管理系统及一般小区内停车场管理系统。针对...

    springboot区校企大型仪器智慧共享平台毕业设计程序

    详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有...

    毕业论文基于web的机房管理系统设计与实现

    对实验室的全方位开放,是适应教育事业的...系统的关键是上机管理模块系统的设计。查询功 能也是系统的核心之一。该系统是大型数据库 Access 与 DELPHI技术的完美结 合,以方便性,安全性,稳定性,易操作性为特点。

    光纤光栅传感系统设计原理与关键技术

    随着光纤光栅传感技术在大型桥梁、建筑结构、健康监测(SHM)等工程中的应用,越来越需要具有大容量、抗干扰性强,灵敏度高而成本较低的光纤光栅传感系统。使用复用技术是实现光纤光栅传感系统大容量的基本方法。

    论文研究-一种适用于关键性业务系统的信息采集和处理模型.pdf

    介绍了一种适用于关键性大型业务系统的信息采集和处理模型。该模型较好地实现了基于WWW平台,采用低速连接来实现大规模的信息采集、处理、数据分发的功能,...根据该模型成功地设计和实现了一个大型的关键性业务系统。

Global site tag (gtag.js) - Google Analytics