`
flash59
  • 浏览: 97724 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

类似于QQ游戏百万人同时在线的服务器架构实现(转)

阅读更多
QQ游戏于前几日终于突破了百万人同时在线的关口,向着更为远大的目标迈进,这让其它众多传统的棋牌休闲游戏平台黯然失色,相比之下,联众似乎已经根本不是QQ的对手,因为QQ除了这100万的游戏在线人数外,它还拥有3亿多的注册量(当然很多是重复注册的)以及QQ聊天软件900万的同时在线率,我们已经可以预见未来由QQ构建起来的强大棋牌休闲游戏帝国。
  那么,在技术上,QQ游戏到底是如何实现百万人同时在线并保持游戏高效率的呢?
  事实上,针对于任何单一的网络服务器程序,其可承受的同时连接数目是有理论峰值的,通过C++中对TSocket的定义类型:word,我们可以判定这个连接理论峰值是65535,也就是说,你的单个服务器程序,最多可以承受6万多的用户同时连接。但是,在实际应用中,能达到一万人的同时连接并能保证正常的数据交换已经是很不容易了,通常这个值都在2000到5000之间,据说QQ的单台服务器同时连接数目也就是在这个值这间。
  如果要实现2000到5000用户的单服务器同时在线,是不难的。在windows下,比较成熟的技术是采用IOCP--完成端口。与完成端口相关的资料在网上和CSDN论坛里有很多,感兴趣的朋友可以自己搜索一下。只要运用得当,一个完成端口服务器是完全可以达到2K到5K的同时在线量的。但,5K这样的数值离百万这样的数值实在相差太大了,所以,百万人的同时在线是单台服务器肯定无法实现的。
  要实现百万人同时在线,首先要实现一个比较完善的完成端口服务器模型,这个模型要求至少可以承载2K到5K的同时在线率(当然,如果你MONEY多,你也可以只开发出最多允许100人在线的服务器)。在构建好了基本的完成端口服务器之后,就是有关服务器组的架构设计了。之所以说这是一个服务器组,是因为它绝不仅仅只是一台服务器,也绝不仅仅是只有一种类型的服务器。
  简单地说,实现百万人同时在线的服务器模型应该是:登陆服务器+大厅服务器+房间服务器。当然,也可以是其它的模型,但其基本的思想是一样的。下面,我将逐一介绍这三类服务器的各自作用。
  登陆服务器:一般情况下,我们会向玩家开放若干个公开的登陆服务器,就如QQ登陆时让你选择的从哪个QQ游戏服务器登陆一样,QQ登陆时让玩家选择的六个服务器入口实际上就是登陆服务器。登陆服务器主要完成负载平衡的作用。详细点说就是,在登陆服务器的背后,有N个大厅服务器,登陆服务器只是用于为当前的客户端连接选择其下一步应该连接到哪个大厅服务器,当登陆服务器为当前的客户端连接选择了一个合适的大厅服务器后,客户端开始根据登陆服务器提供的信息连接到相应的大厅上去,同时客户端断开与登陆服务器的连接,为其他玩家客户端连接登陆服务器腾出套接字资源。在设计登陆服务器时,至少应该有以下功能:N个大厅服务器的每一个大厅服务器都要与所有的登陆服务器保持连接,并实时地把本大厅服务器当前的同时在线人数通知给各个登陆服务器,这其中包括:用户进入时的同时在线人数增加信息以及用户退出时的同时在线人数减少信息。这里的各个大厅服务器同时在线人数信息就是登陆服务器为客户端选择某个大厅让其登陆的依据。举例来说,玩家A通过登陆服务器1连接到登陆服务器,登陆服务器开始为当前玩家在众多的大厅服务器中根据哪一个大厅服务器人数比较少来选择一个大厅,同时把这个大厅的连接IP和端口发给客户端,客户端收到这个IP和端口信息后,根据这个信息连接到此大厅,同时,客户端断开与登陆服务器之间的连接,这便是用户登陆过程中,在登陆服务器这一块的处理流程。
  大厅服务器:大厅服务器,是普通玩家看不到的服务器,它的连接IP和端口信息是登陆服务器通知给客户端的。也就是说,在QQ游戏的本地文件中,具体的大厅服务器连接IP和端口信息是没有保存的。大厅服务器的主要作用是向玩家发送游戏房间列表信息,这些信息包括:每个游戏房间的类型,名称,在线人数,连接地址以及其它如游戏帮助文件URL的信息。从界面上看的话,大厅服务器就是我们输入用户名和密码并校验通过后进入的游戏房间列表界面。大厅服务器,主要有以下功能:一是向当前玩家广播各个游戏房间在线人数信息;二是提供游戏的版本以及下载地址信息;三是提供各个游戏房间服务器的连接IP和端口信息;四是提供游戏帮助的URL信息;五是提供其它游戏辅助功能。但在这众多的功能中,有一点是最为核心的,即:为玩家提供进入具体的游戏房间的通道,让玩家顺利进入其欲进入的游戏房间。玩家根据各个游戏房间在线人数,判定自己进入哪一个房间,然后双击服务器列表中的某个游戏房间后玩家开始进入游戏房间服务器。
  游戏房间服务器:游戏房间服务器,具体地说就是如“斗地主1”,“斗地主2”这样的游戏房间。游戏房间服务器才是具体的负责执行游戏相关逻辑的服务器。这样的游戏逻辑分为两大类:一类是通用的游戏房间逻辑,如:进入房间,离开房间,进入桌子,离开桌子以及在房间内说话等;第二类是游戏桌子逻辑,这个就是各种不同类型游戏的主要区别之处了,比如斗地主中的叫地主或不叫地主的逻辑等,当然,游戏桌子逻辑里也包括有通用的各个游戏里都存在的游戏逻辑,比如在桌子内说话等。总之,游戏房间服务器才是真正负责执行游戏具体逻辑的服务器。
  这里提到的三类服务器,我均采用的是完成端口模型,每个服务器最多连接数目是5000人,但是,我在游戏房间服务器上作了逻辑层的限定,最多只允许300人同时在线。其他两个服务器仍然允许最多5000人的同时在线。如果按照这样的结构来设计,那么要实现百万人的同时在线就应该是这样:首先是大厅,1000000/5000=200。也就是说,至少要200台大厅服务器,但通常情况下,考虑到实际使用时服务器的处理能力和负载情况,应该至少准备250台左右的大厅服务器程序。另外,具体的各种类型的游戏房间服务器需要多少,就要根据当前玩各种类型游戏的玩家数目分别计算了,比如斗地主最多是十万人同时在线,每台服务器最多允许300人同时在线,那么需要的斗地主服务器数目就应该不少于:100000/300=333,准备得充分一点,就要准备350台斗地主服务器。
  除正常的玩家连接外,还要考虑到:
  对于登陆服务器,会有250台大厅服务器连接到每个登陆服务器上,这是始终都要保持的连接;
  而对于大厅服务器而言,如果仅仅有斗地主这一类的服务器,就要有350多个连接与各个大厅服务器始终保持着。所以从这一点看,我的结构在某些方面还存在着需要改进的地方,但核心思想是:尽快地提供用户登陆的速度,尽可能方便地让玩家进入游戏中。
分享到:
评论
5 楼 tomore 2008-04-10  
厉害,学习中
4 楼 myreligion 2008-01-03  
QQ游戏和中央服务器通讯应该也只是心跳通信或者退出切换的通讯,这种方式或者用web方式(web集群已经非常成熟,问题不大),或者直接udp通信,不维持链接,服务器成本也不会太高。
3 楼 soci 2007-12-25  
rtdb 写道
转的,没意思。著者水平也就一般。

提个醒:

1 QQ架构中最重要的就是客户直接通信的无服务器模式。
2 客户在登陆服务器完成登陆后,没必要保持连接的。

所以,可能只要1/10的服务器就够了。



QQ游戏 还是要和中央服务器保持连接的
2 楼 clasp 2007-12-24  
不错!以前也知道点.再讲得深入会更好..不知系统安全怎么解决.
1 楼 rtdb 2007-12-14  
转的,没意思。著者水平也就一般。

提个醒:

1 QQ架构中最重要的就是客户直接通信的无服务器模式。
2 客户在登陆服务器完成登陆后,没必要保持连接的。

所以,可能只要1/10的服务器就够了。

相关推荐

    类似于QQ的软件,C#编写

    标题中的“类似于QQ的软件”指的是一个使用C#编程语言开发的应用程序,其设计目标是模仿或实现类似QQ的功能。QQ是一款在中国极其流行的即时通讯软件,提供了聊天、群聊、文件传输等多种通信服务。C#是一种面向对象的...

    C#+Sql Server2005做的类似于QQ的聊天软件

    这个标题提到的是一个使用C#编程语言和SQL Server 2005数据库开发的聊天软件项目,其设计灵感来源于QQ,一款广为人知的即时通讯软件。这个项目可能是为了教学或学习目的,帮助初学者理解如何构建类似的通信应用。 ...

    类似qq的聊天程序mfc编写

    本项目“类似qq的聊天程序mfc编写”利用了MFC框架,旨在实现一个与QQ类似的聊天应用程序,具备用户登录和聊天功能。在这个过程中,开发者需要深入理解网络编程,特别是使用无连接的UDP(User Datagram Protocol)...

    类似QQ的即时通信

    本项目“类似QQ的即时通信”旨在实现一个具备基本聊天功能的系统,其中包括服务器端和客户端两部分,采用C#编程语言和SQL Server 2005数据库系统。 1. **C#编程语言**:C#是由微软开发的一种面向对象的编程语言,...

    71丨命令模式:如何利用命令模式实现一个手游后端架构?1

    它通过将函数封装为对象,使得函数可以在对象之间传递和控制执行,类似于回调机制。 在实际应用中,特别是在手游后端架构中,命令模式可以发挥重要作用。例如,假设我们正在开发一款类似《天天酷跑》或《QQ卡丁车》...

    c# 聊天软件 qq 源码 多人聊天 加好友

    在这个项目中,我们将深入探讨如何使用C#构建一个类似于QQ的聊天软件,实现多人聊天和加好友的功能。 一、基础架构 1. **用户注册与登录**:首先,我们需要设计一个用户系统,允许用户注册并保存他们的信息,如...

    FLASH WEBGame 多人游戏社区(源码+服务端)

    本资源提供了一个基于FLASH技术的多人在线游戏社区的完整源码和服务端,旨在帮助开发者理解和构建类似的WebGame平台。以下是对这个项目的详细解析。 首先,我们要明确的是,FLASH是一种广泛应用于网页动画和游戏...

    游戏作文之游戏开发开题报告.docx

    本文主要探讨的是开发一款休闲游戏平台,类似于QQ游戏大厅的项目。 **一、选题目的与意义** 开发高质量的休闲游戏平台旨在满足日益增长的娱乐需求,特别是在互联网普及的背景下,游戏已经成为许多人工作、学习之余...

    即时通信服务器.ppt

    FICQ的特点在于其简洁的界面和丰富的功能,如在线游戏、文件共享、视频聊天等,同时对计算机配置要求较低,使得它成为小型网络环境的理想选择。 总的来说,即时通信服务器的搭建和配置涉及多个步骤,从服务器软件的...

    用c#写的聊天程序需要服务器支持

    标题中的“用C#写的聊天程序需要服务器支持”揭示了我们正在讨论的是一个基于C#编程语言开发的即时通讯应用,这种应用与QQ聊天类似,依赖于服务器进行数据传输和处理。C#是一种广泛用于构建桌面应用、网络服务以及...

    网络聊天用C#写的类似QQ

    【标题】"网络聊天用C#写的类似QQ" 指的是使用...通过分析和学习这个C#编写的类似QQ的聊天程序源码,开发者不仅可以提升C#编程技能,还能深入了解即时通讯应用的架构和实现细节,为将来开发更复杂的系统打下坚实基础。

    JQQ即时通讯

    在"JQQ即时通讯"中,可能采用了类似于QQ的架构,包括登录服务器、消息服务器和文件传输服务器等不同组件。登录服务器负责验证用户的账号和密码,确保安全登录;消息服务器则处理用户之间的聊天信息,实现即时发送和...

    四国大战 - 联机对战

    【标题】:“四国大战 - 联机对战”是一个关于在线多人游戏开发的主题,主要探讨如何构建一个类似于QQ游戏大厅的系统,允许玩家进行实时的联机对战。 【描述】:虽然描述信息为空,但从标题可以推测,这个项目可能...

    qq模拟android版 带后台

    这种模拟器技术的核心在于它能创建一个虚拟的Android环境,让用户无需在实际手机上安装额外应用或切换应用,就能同时进行多任务处理,例如在玩游戏或者使用其他应用的同时,QQ依然可以保持在线状态。 首先,我们来...

    Python + PyQt5 + MySQL模拟QQ的聊天与娱乐软件

    本项目以Python为编程语言,PyQt5为图形用户界面(GUI)库,MySQL为数据库系统,打造了一个集聊天、文件传输、游戏于一体的模拟QQ的多功能软件。本文将深入探讨这个项目的各个核心组件和技术实现。 首先,Python是...

    C#基于scoket的c/s模式的即时通讯工具

    本项目“C#基于socket的C/S模式的即时通讯工具”旨在创建一个类似QQ和MSN的通信平台,利用C#编程语言和Socket网络编程技术实现客户端(Client)与服务器端(Server)之间的高效通信。 首先,让我们深入理解C/S模式...

    C#企业内部交互系统(仿QQ+源程序)

    【标题】"C#企业内部交互系统(仿QQ+源程序)"所涉及的主要知识点包括C#编程语言、网络通信、多线程处理、UI设计、数据存储以及客户端-服务器架构。 1. **C#编程语言**:C#是.NET框架下的主要开发语言,它具有类型...

    类似QQ的全套聊天系统

    【标题】"类似QQ的全套聊天系统"是一个项目,旨在创建一个与QQ类似的全面聊天解决方案。这个系统可能包括用户注册、登录、实时消息传递、群聊、好友管理、表情发送等核心功能。开发者使用了C#编程语言,这表明他们...

    C++仿qq程序源代码及程序

    在这个项目中,"C++仿qq程序源代码及程序" 提供了一个用C++实现的类似QQ的客户端和服务器端程序。这个项目旨在帮助开发者理解即时通讯(IM)软件的基本架构和工作原理,同时也提供了一个实践C++编程技巧的机会。 ...

Global site tag (gtag.js) - Google Analytics