Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >服务器又宕机了,怎么办?

服务器又宕机了,怎么办?

原创
作者头像
用户8639654
修改于 2021-08-03 10:11:24
修改于 2021-08-03 10:11:24
4K0
举报
文章被收录于专栏:云计算运维云计算运维

我不得不承认,我的能力不足以写出一个100%不会宕机的游戏服务器程序,这也不能全怪我的能力太弱,谁让咱国内网游玩家数量庞大,哪个游戏刚上线时没有挤的爆满过?还有些或是猎奇,或是谋私的个人和组织,在制造着千奇百怪,匪夷所思的数据包及操作流程来试探你的服务器。这些都曾是我在服务器宕机后向老板开脱的理由。

当WOW终于来到中国时,我一边欣喜着终于可以在艾泽拉斯的大陆上自由翱翔,一边却咒骂着9C的破服务器,动不动就宕机。当然,身为游戏程序设计师的我明知道,这大部分的错误都不应归罪于代理商9C,但是,谁让blizzard是我心目中的神,谁又让WOW成为我游戏制作的教科书呢。好吧,我知道上面这段极力追捧blizzard跟WOW的话可能早已让你恶心连连,不堪入目了,对不起,忘了这一节,让我们继续。

服务器宕机后都发生了些什么?

显然的,宕机后玩家会骂,就像我在玩WOW时那样,骂游戏公司,骂老板,骂GM。非常抱歉,我们可爱的玩家们似乎并不清楚,这个时候最该骂的其实是我们这些程序员们。长久的遗忘被我们当成了包容,以至于游戏程序员在公司里都养成了趾高气扬,不可一世的坏毛病:看吧,策划们,你们做的太烂了,数值不平衡,玩法没新意,只会照抄WOW跟大菠萝,能怪玩家骂你们吗?运营不得力,买服务器的钱不知道去了哪里,游戏里卡的要死,偶尔办个活动还没半点吸引力,能不被玩家骂你是无良运营商吗?GM们能不天天被骂家指着骂吗?……呃,又扯远了。

赶紧先把服务器重启吧。老板正站在你的身后,一脸愁容,虽然暂时还没有发作,但看得出来:老板很生气,后果很严重!

玩家们很快又回来了,不得不为玩家们的毅力和执着精神而感动,更为自己的错误而愧疚,凌晨时分,服务器启了又宕,宕了又启,如此反复,可热情的玩家们依然陪着我在折腾。哦,当年安其拉开门的时候,我也曾这样折腾过。

这个时候不是你一个人在战斗。GM们在忙碌地处理着玩家不断打来的投诉电话:刚买的装备在宕机后消失了;花光了身上所有材料合成的武器回档了,但材料却没有还给我……数据库维护组的同事们也在紧张的恢复着数据,尽可能的将玩家的损失减到最少。

真是一件令人沮丧的事。

真的该试着做点什么了吧!

既然我们非常不愿意看到宕机的情况发生,但又无法100%保证写出来的服务器程序一定不会出错,那我们就在当机发生后的抢救措施上花点功夫,让玩家的损失不至于太大,也让我们的维护人员少些压力吧。

一个最简单也最有效的做法是为每一台服务器都配备物理冗余,同步更新冗余服务器上的状态,当宕机发生时,立即将处理切换到后备服务器上。只是,物理冗余的代价太大,从成本方面考虑,老板可能不大愿意点头。

既然不能做硬冗余,那就再来考虑软的吧。

如果只是简单的启动冗余进程,其实是换汤不换药的做法。原来能跑1000人的服务器,由于同时运行了两个相同的进程,使得CPU和内存开销都翻了倍,结果是只能跑500人了。还是要加服务器。

看来只能更深一层,从架构设计上来动手了。

假设我们的游戏世界是由多个独立场景构成的,那么在实现上我们可以让这些场景在进程上也独立,这样做的好处是可以使得一个场景的宕机不会影响到其他场景的正常运行。如果我们的游戏世界物理上没有分隔,是一个无缝的大世界,我们也可以人为的将其分成多个独立区域,所需要做的额外工作是处理好那些站在区域边界附近的对象。事实上,现在的无缝大世界也都是这样实现的。

有了这样一个前提,我们再来看这个已宕掉的场景该如何处理。

还是老办法,赶紧先把它拉起来吧。一个具体可行的方案是,由场景管理器,或者你也有可能叫它世界服务器,来监视各个场景进程的运行状态,当某个场景异常失去联系时,由管理器来将其重新启动。这里需要再花点心思的是,如何让玩家数据正常地发送到新启动的场景进程中,而且这个过程对于客户端来说是透明的。

这个方案听起来似乎不错,只是,如果宕掉的是场景管理器进程,那该怎么办呢?

按照前面的描述,场景管理器可以看作是整个游戏世界的中心,它以一个指挥者的身份维护着游戏世界的有序运行,所以它的宕机对整个游戏世界的影响也将会是巨大的。

有没有什么办法能够使得场景管理器进程再次启动后能够恢复先前的状态呢?

我们可以为管理器和场景进程定义一套协议,使得管理器不仅能够创建并恢复一个已有场景,而且场景管理器还能通过现有的场景进程数据恢复出自己。

一个理论上可行的方案是,场景管理器与场景进程间保持TCP长连接,并以一定频率进行心跳联系,任意一方发现联系中断或长时间未收到心跳包后都会立即做出处理。

如果是管理器发现场景进程失去联系,那就启动新的场景,如前面所描述的那样。如果是场景进程发现管理器失去联系,那就立即启动重连过程,直接再次连接上管理器,然后立即将自己当前的状态和负责的场景ID报告给管理器。管理器通过这些上报的数据就能恢复出游戏世界内的场景对应关系表,也就是恢复出了自己原来的状态。

进程是恢复出来了,可我们忘了最重要的内容:数据。当场景进程宕机后,上面保存的玩家属性数据也随之丢失了,虽然我们能够再次将这个场景创建出来,并把原来在这个场景内的客户端数据重新定向过来,但这些客户端对应的玩家对象的数据却没有了,游戏仍然无法继续。

也许我们可以再做一点修改,把场景内的玩家数据分离出来,保存到一个独立的进程上,比如,我们可以把这个进程叫做数据服务器,或者数据中心之类的。一个隐含的要求是,数据服务器的逻辑实现非常简单,简单到你可以认为它是绝对安全的,不会宕机。所以,保存在这里的玩家数据也就是绝对安全的。

让我们在这个问题上稍微再深入一点。

场景进程上每次执行玩家的游戏逻辑时都要异步地到数据服务器上来存取数据,这个开销可能太大,而且会使得一些游戏逻辑的实现变的很复杂,那么,把一些会频繁使用到的数据直接保存在场景进程中,当数据发生改变时同步更新到数据服务器上,这样可能会比较容易接受。

老板全都满意了吗?

从理论上来说,我们已经解决了场景进程宕机和管理器宕机后的状态恢复问题,并且在场景恢复后也不会因为丢失了玩家数据而无法继续进行游戏,而且,只要处理得当,这个过程对客户端来说可以是完全透明的,也就是玩家根本不知道服务器上有个进程意外结束,我们做了这么多的工作来将它恢复了。

事实上,这个过程的透明也是必须的,我们并不需要嚷嚷着告诉我们的用户,也就是玩家,我们做了多少多少事情来让你玩的更顺畅,又花了多少多少精力来解决因为服务器宕机而引起的麻烦,对于最终的用户来说,他只需要享受最好的服务。闲话少说,让我们继续。

真的已经完全解决了所有问题吗?

想象这样一个场景:我带着几个刚刚降临到艾泽拉斯大陆的伙伴冲向了艾尔文森林,去开荒霍格!正在霍格只剩下一丝血的时候,服务器稍稍卡了一下,等我缓过神来,面前的霍格骤然消失,地上也不见尸体。找了一圈,它正在出生点摇头晃脑,也在四处张望,但头顶上的血条分明是,满血!

怎么回事?

处理这张地图的场景进程意外结束了,服务器的宕机处理机制很快地恢复了这个场景进程,并且把我的客户端数据重新定向到了新场景。只是,事情并不是一切都完美。因为这个场景是完全重新创建的,这意味着所有的怪物也是重新创建并被摆放到了初始位置,所以,只剩下一丝血的霍格碰上了好运气……

类似的还有,正在护送NPC返回营地,在稍微停顿了一会儿之后,NPC又重新回到了原来的地方,等等。

虽然这比起最初的“客户端被迫断开连接,服务器端数据丢失”要进步了许多,但会给我工资的老板仍然可能不太满意,他希望,霍格应该还在我的面前,而且只有一丝血,那个跟着我的NPC也应该还在我旁边……

我要是不能说服老板,这是“根本不可能完成的任务!”,那也就只能坐下来再试一试。

也许,可以考虑将所有对象的数据都保存到数据服务器上,当然,这要求每个怪物都跟玩家一样,有一个唯一ID,这一点实现起来可能会有些麻烦。

再不然,为对象提供一个从已有的内存数据构造的方法,这样便可以使用共享内存来保存现场数据,再从共享内存中恢复出原来的对象。理论上来说,这个方法是可行的,只是,这三十多个字的文字描述要用C++来实现也可能将会是一项极大的挑战,所以,这也仅只是可供参考的一个尝试方案。

我想,我们走的够远了

让我们先暂停一会儿,回过头来看一看最初的目的。其实我们想要的只是尽可能的让服务器进程不要宕机,如果实在是没有办法,就尽可能的让宕机后的玩家损失比较小,不需要我们做大量的工作去做善后处理。

很简单的需求,似乎我们纠缠的有些过头了。

写出能够稳定运行的程序是对程序员的最基本要求,如果一个程序连稳定性都不具备,那根本都不用再去考虑功能啊、扩展啊等其他标准了。但是,正如我最开始所说的,没有一个人能够100%保证他写出来的服务器程序是绝对不会崩溃的。我们所能要求的只是尽可能的仔细,尽可能的多一些必要的测试,离安全尽可能的更近一步。

剩下的就是在宕机后如何降低损失的问题了。

对于一般的MMOG来说,玩家在进入游戏时会从数据库中将该玩家的所有相关数据读到内存,以便快速的进行游戏逻辑的处理,而在玩家下线时再将数据的改动存回数据库。

显然的,当服务器进程出现意外宕机时,内存中所有的数据都丢失了,这也就造成了玩家数据的回档,而且玩家在游戏中呆的时间越长,回档的损失就越大。所以,一个被广泛采用的做法是为玩家数据实现一种定时存盘的机制,就像现在大多数的单机游戏一样,AutoSave。比如,每5分钟自动为玩家存一次盘,这样就可以使得回档的最大损失控制在5分钟以内。

另外,对于一些重要数据的变动,比如玩家花大量游戏货币购买了一件贵重的武器装备,这时可将玩家数据立即做一次存盘操作,这也将有效的减少玩家的重大损失。

听起来这是一项不错的技术,在意外宕机的时候最多只回档5分钟,而且还没有贵重物品的损失,玩家应该是可以接受的吧。

我已经听到了数据库维护员的咆哮

“数据库已经快要崩溃了,你就不能让每秒需要执行的SQL语句少一点吗?”

“呃………”

我一直以为我们的数据库非常强大,可以处理任何的数据,唯一的缺点就是查询速度比直接内存读取要慢很多。所以我使用了异步数据存取的方法,并且开启了多个数据库操作线程来并行的执行我的请求,运行的效果看起来还不错。

也许,我应该来算一算,每秒种究竟丢了多少条操作请求给数据库。

请允许我再自私一回,我已经很久没有提到WOW了……

大概可信的数字是,WOW一组服务器的玩家数量在3000到5000之间,去掉最大的数,再去掉最小的数,最后的平均值是,4000吧,就算4000。

4000人在线,假设也是每5分钟定时存盘一次,再假设所有玩家的存盘时间是平均分布的。这样算下来,每秒种就会有67个玩家向数据库发出存盘请求操作。

才67个,数据库维护组的同事就跟我说不堪重负了?笑话,这数据库服务器是谁买的?

先别急,67是玩家数,但是每个玩家的存盘请求不会只有一条SQL语句。

虽然每个游戏的内容都各有差别,但是一款MMOG需要存入数据库的数据少不了会有技能、物品、任务、宠物、好友、公会这些东西。取决于游戏的类型差异,每个游戏都会有自己的存盘方式,比如我可能会把所有的技能ID作为一条数据来存储,但是我也有可能把每个技能作为一条单独的记录来存储,这样可以方便对技能附加数据的扩展,等等。

但是,游戏中的物品存储大概都是相同的,只能是一件(组)物品作为一条记录来存储。

而且,可以说游戏中存储量最大的就是物品数据。算一算你的角色背包有多大,50格? 100格?还是200格?不要忘了银行、摆摊位、装备拦、宠物背包和邮箱这些地方也能放物品。并且,在游戏进行过程中,玩家背包中物品数据的变动也是相当的频繁,不断的有药品被用掉,不断地又有些小玩意儿被捡起来,不久后,它们又被卖给了NPC。

虽然你可以使用一些巧妙的比较算法来过滤掉那些实际上没有发生变动的物品更新,另外也不是所有的玩家物品数据变动都很频繁,但在实际运营中,尤其是当玩家的背包格数都很多的时候,物品数据的存盘的确会成为一个很大的问题。

除了物品,还有玩家的基本属性存盘,社会关系存盘等等,再加上全局公共数据的存盘,如公会数据,拍卖行物品数据,如果老板也要我在游戏中开上一家拍卖行的话。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一个人的服务器端
能够做这个MMO的触发点是通过某些途径得到了某个大公司使用的一款3D引擎,其他的都是白手起家。当时大家还不知道有“分布式服务器端”一说,服务器端框架参考了《剑3》:剑3内测的时候经常服务器crash,但是每次只crash一个地图,所以可以推知他们是一个地图一个server;加上自己对服务器端的认识,需要Gate当防火墙,需要GameServer来总管MapServer,需要DB来存储,那么最初的服务器端框架就定下来了:Gate、GameServer、MapServer、DBServer。想让服务器之间的连接方式最简化,所以确定GameServer是中心,其他Server都连接并且只连接GameServer。MapServer和GameServer上面准备加脚本,脚本直接选择了python,因为python语法清晰一点。开发平台选择windows,因为当时公司内没有一个人了解linux。
海哥@开发
2022/04/06
6250
我的世界服务器指令大全电脑版_我的世界服务器专用指令
要成为一个合格的服主,熟悉我的世界服务器指令是必须的,服务器内指令的各种功能不仅是OP需要使用,还有部分是玩家也需要知道的,下面就看看小编为大家准备的我的世界服务器指令大全吧。
全栈程序员站长
2022/11/09
3.5K0
我的世界服务器指令大全电脑版_我的世界服务器专用指令
我的世界服务器显示标指令,我的世界服务器指令|我的世界服务器指令大全「建议收藏」
一砖一瓦一世界,这里是uc129我的世界专区。做为有着极高自由度的3d沙盘游戏我的世界来说,带给玩家的不止是视觉上的享受,通过自己的努力打造属于自己的游戏王国,则是游戏的魅力所在。对于minecraft服务器管理员来说,熟练掌握我的世界服务器指令是至关重要的。如果辛辛苦苦建立好服务器却发现对我的世界服务器指令根本就不了解,这是何等的杯具。
全栈程序员站长
2022/11/09
6.1K0
我的世界服务器显示标指令,我的世界服务器指令|我的世界服务器指令大全「建议收藏」
我的世界服务器作弊指令大全_我的世界服务器称号指令
killnpc [all] – 杀死周围全部NPC 或者叫 杀了附近所有除自己外的活体生物
全栈程序员站长
2022/11/09
6.3K0
我的世界服务器作弊指令大全_我的世界服务器称号指令
再谈游戏服务器架构
一、服务器划分原则 在现有的网络游戏服务器端架构中,多是以功能和场景来划分服务器结构的。负载均衡和集群暂且不在本文中讨论(bigworld、atlas)。服务器划分可以基于以下原则: 分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器。 以多线程或多进程的编程方式适应多核处理器。 在同一个服务器架构下,应尽可能的复用某些服务器(进程级别的复用,比如场景服务器)。 运行时玩家数据的保存、修改及数据流向应该是设计的焦点,它同时也决定了服务器应该如何划分。 服务器的划分应该适度,在保
李海彬
2018/03/22
4.6K0
再谈游戏服务器架构
游戏服务器的架构演进(完整版)
游戏服务器端,是一个会长期运行的程序,并且它还要服务于多个不定时,不定点的网络请求。所以这类软件的特点是要非常关注稳定性和性能。这类程序如果需要多个协作来提高承载能力,则还要关注部署和扩容的便利性;同时,还需要考虑如何实现某种程度容灾需求。由于多进程协同工作,也带来了开发的复杂度,这也是需要关注的问题。
曲水流觞
2020/07/13
5.7K0
游戏服务器的架构演进(完整版)
Golang语言社区--游戏服务器端开发的一些建议(转载)
大家好,我是Golang语言社区(www.golang.ltd)主编彬哥,本篇给大家转载一篇关于游戏服务器开发的文章。
李海彬
2018/03/18
2.9K0
Golang语言社区--游戏服务器端开发的一些建议(转载)
1 游戏服务器开发的基本体系与服务器端开发的一些建议
近年来,我身边的朋友有很多都从web转向了游戏开发。他们以前都没有做过游戏服务器开发,更谈不上什么经验,而从网上找的例子或游戏方面的知识,又是那么的少,那么的零散。当他们进入游戏公司时,显得一脸茫然。如果是大公司还好点,起码有人带带,能学点经验,但是有些人是直接进入了小公司,甚至这些小公司只有他一个后台。他们一肩扛起了公司的游戏后端的研发,也扛起了公司的成败。他们也非常尽力,他们也想把游戏的后端做好。可是就是因为没什么经验,刚开始时以为做游戏服务器和做web差不多,但是经过一段时间之后,才发现代码太多,太乱了,一看代码都想重构,都是踩着坑往前走。
范蠡
2018/07/25
5.4K0
1 游戏服务器开发的基本体系与服务器端开发的一些建议
CMI | 常用命令及其命令作用
/actionbarmsg [指定玩家/all] [消息] 给指定玩家或所有人发送一条actionbar消息 /afk (玩家名) (理由) 将自己或他人切换为AFK模式.可说明理由 /afkcheck [玩家名] 检查玩家的AFK状态 /air [玩家名] [空气值] 设置指定玩家的空气值 /alert [玩家名] (理由) 警报玩家,当拥有特定权限的玩家或管理员上线时收到提示信息 需要拥有权限节点 command.alert.info.inform 才能收到消息 /aliaseditor (新指令别名)
BreezeCloud
2022/10/04
6.9K0
论可复用的游戏服务器端开发框架(四)
战斗系统的模型构建思考 战斗系统是一个游戏的玩法核心,也是游戏之间差别最大的地方,想要建立可复用的模型,可谓困难最大。但是,游戏的玩法本身也是有分类和传承的。需要特别注意的是,作为服务器端程序,战斗系统的职责是有多种不同层级的: 记录战斗结果,发放战斗奖励。很多开房间和按“局”算的游戏,如棋牌类,其游戏本身是分为很多“局”的。游戏是在一局结束后,才结算所有的奖励。另外如《地下城与勇士》(DNF),其游戏为一个个地下城“副本”,本身也是这种分局的。如果服务器端只是为了游戏完成一局后做“结算”,那么其逻辑还是比
韩伟
2018/03/05
2.5K0
论可复用的游戏服务器端开发框架(四)
Redis在游戏服务器中的应用
排行榜 游戏服务器中涉及到很多排行信息,比如玩家等级排名、金钱排名、战斗力排名等。 一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合。 但是有时候我们需要每一个玩家的排名,玩家的数量太多,不能利用数据库(全表排序压力太大),自己维护也会比较麻烦。 使用Redis可以很好的解决这个问题。它提供的有序Set,支持每个键值(比如玩家id)拥有一个分数(score),每次往这个set里添加元素, Redis会对其进行排序,修改某一元素的score后,也会
李海彬
2018/03/21
2.4K0
游戏服专区攻略:《7日杀》存档备份及配置修改
注意:有几个游戏设置在开始新游戏时无法更改。 您可以使用控制台命令在游戏中更改其中一些设置。 例如:设置游戏偏好 BedrollDeadZoneSize 30
嘉钰
2025/04/15
9573
游戏服专区攻略:《7日杀》存档备份及配置修改
想要制作沙盒游戏?那么这一款插件你一定不能错过(Unity3D)
VOXL是一款简单且易于理解的多重体素沙盒游戏,使用Unity的UNET网络系统开发。
恬静的小魔龙
2022/08/07
2.1K0
想要制作沙盒游戏?那么这一款插件你一定不能错过(Unity3D)
【专业技术】如何搭建游戏服务器?
存在问题: 手游越来越火了,听听业内人士的分析,他山之石,多多借鉴,那么手游的服务器到底如何搭建的? 解决方案: 从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务器开发,就随便聊聊游戏服务器开发需要的技术。(以下所指游戏服务器更偏向于手游,因为我对端游和页游开发接触并不多) 一.聊聊服务器开发有哪些东西要考虑。 1.开发语言的选择: 工欲善其事,必先利其器,选择一门适合的开发语法对后期开发有着事半功倍的作用。 业界主要的是c/c++ + Pyt
程序员互动联盟
2018/03/15
12.7K0
网游类似魔兽世界的服务器维护都是在干嘛?
来,我作为前网易游戏从业人员来说说真正服务器维护时候在做什么。 服务器维护分成两种,紧急维护和日常维护。 紧急维护一般就是硬件故障或者严重 Bug。这个时候是各个团队最紧张的时候。每个团队都忙个不停。 运营团队会发布公告,安慰玩家,统计损失,编写故障报告,评定故障等级等等 策划团队可能会考虑 Bug 的影响程度,决定要不要回档,或者赔偿什么,赔偿会不会影响经济系统等等。 程序团队最重要的是缩小 Bug 的影响,比如热更新屏蔽玩法,然后解决 Bug。有时候硬件故障会导致整个服务器某些结点负载不均衡,或者万一数
李海彬
2018/03/26
2.5K0
关于网游分布式服务器的讨论?
如题 请大家讨论一下网游服务器端结构设计方面的问题。 希望大家畅所欲言,能说说细节更好。 还有关于网络游戏其他方面的问题也可以。 在此先摘篇文章 随着网游从业者的规模和需求不断扩大,越来越多的朋友进入了网游开发这个领域,使得市场中网游开发技术相关的需求量迅猛增长。目前,(网游)网络游戏行业比较紧缺的是具有较深技术功底的“专家型”开发者,这主要包括两个方面:服务器端设计人员以及客户端设计人员。对于网络游戏而言,由于其主要的游戏逻辑计算是在服务器端完成的,数据同步与广播信息的传递也是通过服务器完成的,所以,是否拥有一个有经验的服务器端设计人员已经成为一款网游产品能否成功的关键之一。鉴于此,本文将试图就网游服务器设计的一系列问题展开讨论和总结,笔者将结合自己的开发经验和体会,将其中各方面内容逐一呈现。希望能够对以下三类人员有所帮助:   有一定网络编程基础、准备进入(网游)网络游戏行业作服务器端设计的人员;   正在从事网游服务器设计的人员;   网游项目的技术负责人。   由于网游服务器的设计牵涉到太多内容,比如:网络通信方面、人工智能、数据库设计等等,所以本文将重点从网络通信方面的内容展开论述。谈到网络通信,就不能不涉及如下五个问题: 1、 常见的网游服务通信器架构概述 2、 网游服务器设计的基本原则 3、 网游服务器通信架构设计所需的基本技术 4、 网游服务器通信架构的测试 5、 网游服务器通信架构设计的常见问题 下面我们就从第一个问题说起: 常见的网游服务器通信架构概述   目前,国内的网游市场中大体存在两种类型的网游游戏:MMORPG(如:魔兽世界)和休闲网游(如:QQ休闲游戏和联众游戏,而如泡泡堂一类的游戏与QQ休闲游戏有很多相同点,因此也归为此类)。由于二者在游戏风格上的截然不同,导致了他们在通信架构设计思路上的较大差别。下面笔者将分别描述这两种网游的通信架构。 1.MMORPG类网游的通信架构   网游的通信架构,通常是根据几个方面来确定的:游戏的功能组成、游戏的预计上线人数以及游戏的可扩展性。   目前比较通用的MMORPG游戏流程是这样的: a. 玩家到游戏官方网站注册用户名和密码。 b. 注册完成后,玩家选择在某一个区激活游戏账号。 c. 玩家在游戏客户端中登录进入已经被激活的游戏分区,建立游戏角色进行游戏。   通常,在这样的模式下,玩家的角色数据是不能跨区使用的,即:在A区建立的游戏角色在B区是无法使用的,各区之间的数据保持各自独立性。我们将这样独立的A区或B区称为一个独立的服务器组,一个独立的服务器组就是一个相对完整的游戏世界。而网游服务器的通信架构设计,则包括了基于服务器组之上的整个游戏世界的通信架构,以及在一个服务器组之内的服务器通信架构。   我们先来看看单独的服务器组内部的通信是如何设计的。   一个服务器组内的各服务器组成,要依据游戏功能进行划分。不同的游戏内容策划会对服务器的组成造成不同的影响。一般地,我们可以将一个组内的服务器简单地分成两类:场景相关的(如:行走、战斗等)以及场景不相关的(如:公会聊天、不受区域限制的贸易等)。为了保证游戏的流畅性,可以将这两类不同的功能分别交由不同的服务器去各自完成。另外,对于那些在服务器运行中进行的比较耗时的计算,一般也会将其单独提炼出来,交由单独的线程或单独的进程去完成。   各个网游项目会根据游戏特点的不同,而灵活选择自己的服务器组成方案。经常可以见到的一种方案是:场景服务器、非场景服务器、服务器管理器、AI服务器以及数据库代理服务器。   以上各服务器的主要功能是:   场景服务器:它负责完成主要的游戏逻辑,这些逻辑包括:角色在游戏场景中的进入与退出、角色的行走与跑动、角色战斗(包括打怪)、任务的认领等。场景服务器设计的好坏是整个游戏世界服务器性能差异的主要体现,它的设计难度不仅仅在于通信模型方面,更主要的是整个服务器的体系架构和同步机制的设计。   非场景服务器:它主要负责完成与游戏场景不相关的游戏逻辑,这些逻辑不依靠游戏的地图系统也能正常进行,比如公会聊天或世界聊天,之所以把它从场景服务器中独立出来,是为了节省场景服务器的CPU和带宽资源,让场景服务器能够尽可能快地处理那些对游戏流畅性影响较大的游戏逻辑。   服务器管理器:为了实现众多的场景服务器之间以及场景服务器与非场景服务器之间的数据同步,我们必须建立一个统一的管理者,这个管理者就是服务器组中的服务器管理器。它的任务主要是在各服务器之间作数据同步,比如玩家上下线信息的同步。其最主要的功能还是完成场景切换时的数据同步。当玩家需要从一个场景A切换到另一个场景B时,服务器管理器负责将玩家的数据从场景A转移到场景B,并通过协议通知这两个场景数据同步的开始与结束。所以,为了实现这些内容繁杂的数据同步任务,服务器管理器通常会与所有的场景服务器和非场景服务器保持socke
李海彬
2018/07/26
1.6K0
关于网游分布式服务器的讨论?
游戏服务器之逻辑服务器的资源分布图
线程类型分成三大类:主线程、网络线程、业务线程。 一、主线程 1、程序主线程(线程1) 读取服务器配置,读取逻辑数据配置,启动账号管理器、日志管理器,启动逻辑引擎(启动账号管理器、启动db管理器(连接数据服务器进程)、启动网关、启动日志管理器、初始化游戏命令)。 二、网络线程 1、逻辑网关(线程2-4和n) 框架是使用多网关结构的逻辑进程。每启动一个逻辑网关,就会启动对应的网络连接监听、接收、发送、和数据缓存处理线程: 网络线程类型包括: (1)网络连接监听线程 (2)网络数据接收线程 (3)数据缓冲处理
李海彬
2018/03/22
9900
9 百万用户级游戏服务器架构设计
所谓服务器结构,也就是如何将服务器各部分合理地安排,以实现最初的功能需求。所以,结构本无所谓正确与错误;当然,优秀的结构更有助于系统的搭建,对系统的可扩展性及可维护性也有更大的帮助。
范蠡
2018/07/25
4.2K0
9 百万用户级游戏服务器架构设计
用 Node.js 写一个多人游戏服务器引擎 [每日前端夜话0x31]
听说过文字冒险游戏吗? 如果你的年龄足够大的话(就像我一样),那么你可能听说过、甚至玩过“back in zhe day”。在本文中,我将向你展示编写的整个过程。这不仅仅是一个文本冒险游戏,而是一个能让你和你的朋友们一起玩的,可以进行任何剧情的文本冒险游戏引擎。 没错,我们将通过在添加多人游戏功能来增加它的趣味性。
疯狂的技术宅
2019/03/27
2.4K0
用 Node.js 写一个多人游戏服务器引擎 [每日前端夜话0x31]
游戏服务端究竟解决了什么问题?
当讨论到游戏服务端的时候,我们首先想到的会是什么?要回答这个问题,我们需要从游戏服务端的需求起源说起。
李海彬
2018/07/26
1.4K0
游戏服务端究竟解决了什么问题?
推荐阅读
相关推荐
一个人的服务器端
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档