本文出处 http://blog.csdn.net/sodme
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多个连接与各个大厅服务器始终保持着。所以从这一点看,我的结构在某些方面还存在着需要改进的地方,但核心思想是:尽快地提供用户登陆的速度,尽可能方便地让玩家进入游戏中。
评论:首先申明以上的作者是网易游戏团队的核心人物,此番转载其文,只是学习之用,别无它意。同时,在此也进行一点评论。大宝(CSDN昵称)前辈分析得并无错,且精华之至,特别是在三种功能服务器上的分析也是非常到位。目前而言,不管是游戏在线还是其他办公通讯在线系统,在并发数的量上,已经越来越大,少则数十、几百,多则数万、百万,在线数的瓶颈其实也就是带宽的问题,理论上,带宽越大,瓶颈问题也可以适当的得到解决。作者说到的三种服务器,如登录的、大厅的、游戏的,都是在各自的领域中进行分压,同理的,在如登录性质的服务器上再进行分压,因此在线数在未来也不是一个大难题了。不过我们要注意到,作者说到的,只是单纯的游戏,没有包括其他的娱乐辅助用途,如视频,音频,文字,送礼等,而普通情况下,一路音视频要占的带宽起码也要30kbps,可见如果在此基础上再添加了网友之间的可视通讯功能,对服务器的压力将会成几何数增长。
登录服务器一般影响不变,因为它们只管验证等信息,大厅服务器根据各自性质也许会受到一些影响,但也不是大问题,因此最大的瓶颈还是在游戏服务器上了,如果多人同时语音视频的进行游戏,而牵涉到带宽等限制的因素,通讯与游戏的质量一定非常差,由此,不少的游戏厂商为是否引进音视频通讯而犹豫不定,因为多人在线游戏不是难题,困难的只是多人音视频同时游戏!
早在08年的时候,盛大游戏旗下的边锋其实已经意识到该问题,而同年,也顺利的解决了该问题。他们用到的并不是自己的音视频通讯技术,而是采用合作的方式,向广州的一家公司购买音视频通讯SDK,使之嵌入到盛大游戏的系统中,音视频通讯很多人都做过,但高质量的,健壮的却是屈指可数。运用了P2P技术完美的解决对游戏服务器压力过大的难题,同时也解决了声音,图像不稳定的故障。
盛大游戏采取的就是佰锐公司旗下的一种SDK——AnyChat SDK,不管是编码与解码,都是做的相当细致的,目前,盛大游戏虽然在游戏产业也受到QQ公司的影响,但是在引进可视化游戏功能后还是得到玩家们的青睐。当然,音视频通讯SDK不仅可以用于在游戏中,更多地也用在其他领域,如政府机构下的应急指挥系统,视频会议下的可视化平台,远程教育等都是普遍适用该即时通讯SDK的。
分享到:
相关推荐
基于 ECharts 的大数据分析可视化平台实现无人售货机用户分析教案 本教案旨在引导学生学习基于 ECharts 的大数据分析可视化平台,配置无人售货机零售项目的工程,掌握可视化仪表盘的配置方法,了解大数据分析可视化...
山海鲸可视化世界通讯工具提供了一种高效的方式来呈现和分析大量通讯数据,通过大屏模板,用户可以直观地了解全球通信设备的状态、趋势以及模式。 这个“山海鲸可视化世界通讯工具数据可视化大屏模板文件分享”资源...
这里通过python的绘图工具Matplotlib包可视化实现机器学习中的KNN算法。 需要提前安装python的Numpy和Matplotlib包。 KNN–最近邻分类算法,算法逻辑比较简单,思路如下: 1.设一待分类数据iData,先计算其到已...
今天分享一个音乐可视化的程序,什么是音乐可视化,就像下面这样 没错,就是这个东西,这个似乎有一个名词来称呼的吧,什么名词呢想不到了,就叫她音乐可视化吧。 基本思路是这样,这个东西应该就是音乐中不同频率...
前端可视化静态页面和可视化大屏是 Web 前端开发中常见的两种应用场景。下面我将分别介绍它们的特点和常用的技术。 可视化静态页面 可视化静态页面主要用于展示数据和信息,并通过图表、图形等可视化元素呈现给用户...
课程设计基于Python+Flask框架实现的新冠疫情可视化项目源码课程设计基于Python+Flask框架实现的新冠疫情可视化项目源码课程设计基于Python+Flask框架实现的新冠疫情可视化项目源码课程设计基于Python+Flask框架实现...
Java web数据可视化实现原理解析 Java Web 数据可视化是当今数据分析和展示的一种重要形式,它能够将复杂的数据转换为易于理解和分析的可视化图形,从而帮助用户更好地理解和分析数据。下面将对 Java web 数据可视...
基于springboot的短视频流量数据分析与可视化系统-基于Web的短视频流量数据分析与可视化系统设计与实现-短视频流量数据分析与可视化网站-短视频流量数据分析与可视化网站代码-短视频流量数据分析与可视化平台-短视频...
99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 99套数据可视化源码 ...
《医学图像三维重建和可视化——VC++实现实例》是一本深入探讨医学图像处理和可视化技术的专业书籍。书中重点介绍了如何使用C++编程语言,结合VTK(Visualization Toolkit)和OpenGL库来实现医学图像的三维重建与...
毕业设计基于Python的豆瓣网站数据爬取与可视化的设计与实现项目源码。通过python爬去豆瓣网的数据,用大数据基础对数据进行清洗,然后对清洗的数据可视化,更直观的展示出来。毕业设计基于Python的豆瓣网站数据爬取...
在这个Java实现中,我们可以看到一个完整的二叉树可视化系统,包括四个关键的Java源文件:BinaryNode、Show1_12、Display_Tree和TreeControl。 1. **BinaryNode.java**: 这个文件代表二叉树的基本节点。在Java中,...
大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据...
云计算工作流调度算法可视化Java实现源码.zip云计算工作流调度算法可视化Java实现源码.zip云计算工作流调度算法可视化Java实现源码.zip云计算工作流调度算法可视化Java实现源码.zip云计算工作流调度算法可视化Java...
git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git ...
数据可视化案例—基于影视数据的分析与可视化展示系统。全部资料都在内,新手可自己动手,高手可二次开发。 数据可视化案例—基于影视数据的分析与可视化展示系统。全部资料都在内,新手可自己动手,高手可二次开发...
在本项目中,使用Java语言实现了一个哈夫曼编码和解码的可视化界面,使得用户能够直观地观察到编码和解码的过程。 首先,`HuffmanAlgorithmAbstract.java`和`HuffmanAlgorithmImpl1.java`是哈夫曼编码算法的抽象类...
本文详细探讨了大数据可视化分析系统的设计与实现,尤其是针对图书馆大数据的应用场景,提供了系统性的分析和具体实施方法。 大数据可视化分析系统的核心目标是处理图书馆管理与读者服务过程中的大量数据,包括运营...
数据可视化是 Tableau 的核心功能之一。通过本书的学习,读者将能够学习如何创建各种图表、地图、仪表盘等可视化组件,並且掌握如何使用 Tableau 的拖拉拽功能来快速创建可视化组件。 第三部分:数据分析 在数据...
在前端,我们可以使用JavaScript库如D3.js(Data-Driven Documents)来实现高度定制化的数据可视化。D3.js允许开发者直接操作DOM(Document Object Model),结合HTML、SVG和CSS,创建出各种动态和交互式的图表。...