我们提供安全,免费的手游软件下载!

TT下载站永久免费软件下载站

当前位置: 主页 > 手赚资讯 > 游戏资讯

从演进视角看游戏与WEB服务端的架构差异

来源:网络整理 更新时间:2025-01-04 01:00:44 点击:

循环逻辑

占有很大比重

比重小,甚至没有

数据库

重要

重要

(都很重要,不是我们谈的重点)

静态资源请求

很少,几乎没有

占有很大比重

(是有前后端分离,但后续会说明)

用户间实时交互

(很多web的用户间交互并不需要实时性,甚至有些不需要交互)

延迟的敏感性

一般

(例如游戏中角色攻击另外一个角色时对方需要立刻感知;web当然也是响应越快越好,但敏感性不如游戏)

PS:web是个很大的概念,本文所指的web业务,大多指web1.0的短链接增删改查,而对于web2.0例如直播、聊天、工具协同,它也会涉及复杂的协同处理。

高并发的演变-多进程

随着负载增加,单进程的架构难以应对,就需要扩展成单机多进程(分布式我们后面再说),游戏服务器与web服务器的演进路线开始分化。对于MMORPG游戏,一种做法是将不同地图分到不同的进程去处理(如下图),例如进程1处理“兽人村落”这张地图上的玩家交互和怪物逻辑,进程2处理“森林”这张地图上的内容。这种做法是合理的,因为玩家大多是在同一张地图间交互,跨地图交互的逻辑很少;当玩家切换到另一张地图时,就将玩家数据切换到另一个进程;而对于少部分需要跨服交互的内容(例如全服聊天),再通过另一个进程做消息转发。我们对比下原始的架构和多进程的架构,会发现多进程架构其实是原始架构的直接扩展,相当于多启动几个原来的单进程服务器,再做些多进程适配,虽然说这个所谓的多进程适配其实要改蛮多东西的,比如要处理玩家的切换地图逻辑等等。

网站游戏传奇_游戏网站_澳门棋牌网站游戏

而web,那就不一样了,做web的同学聪明的发现,web大部分业务都是处理用户请求,也没有什么“玩家切换地图”这种破事,能不能就搞个什么什么框架,啥都不改直接用最好,然后还真的给他们整出来了。如下图所示,他们开发了能够调度“应用框架”的web服务器,原来的单进程服务器退化成了“应用框架”。服务端启动时,web服务器会分发多个工作进程(以较为常见的一种做法举例),工作进程会去加载应用框架,当用户发送请求时,服务器主进程将消息分发到某一个工作进程中,工作进程再调用应用框架中的某些方法完成请求的处理。以python的web技术栈为例(主要是最近做一些AI内容用pyhon web,那就用python举例吧),诸如django、flask对应的是应用框架,而uwsgi、waitress对应的是web服务器。

澳门棋牌网站游戏_游戏网站_网站游戏传奇

web的这种做法对于请求处理很适用,不过一些服务器的自身循环逻辑还得专门处理下。先对比下游戏服务器的逻辑,如下图中,每个进程处理的怪物逻辑,其实跟单进程时候的做法没有太多矛盾,各个地图是独立的,就算有矛盾,反之在适配多进程时都要改不少东西,那也就顺便给改了。

澳门棋牌网站游戏_游戏网站_网站游戏传奇

对于web,而举个例子,假设留言板服务器除了增删改查外,还有一个“定时插入”功能,就是每隔半小时向数据库插入一条假的留言数据,以营造出人气很高的假象。如果是原始的单进程,那只需开个异步定时器,然后每隔半小时执行一次数据库插入的逻辑。但多进程时就有问题了,如下图所示,如果像写单进程应用一样写代码,那每个工作进程都会每个半小时执行一次插入逻辑,对于整个系统而言,它会每半小时插入两条数据,与预期不符。

网站游戏传奇_游戏网站_澳门棋牌网站游戏

web因为用上统一的框架,自然无法随便改,web的同学就绞尽脑汁想解决方案了。最简单的办法,web服务器给应用框架传参,让应用框架能判断自己是第几个工作进程,只让第一个工作进程执行逻辑就可以了,其他进程不执行。不过这种方法很快被web同学否定了,因为web同学比较关注能不能抽象成统一的方案,而不是这种一堆if else特殊处理的。

web同学经过苦思冥想,抽象出任务队列框架的概念,如下图所示,重新开个额外的进程,然后把应用框架的功能分开,对于“请求处理”部分,就还是放到原先的工作进程去处理,对于“逻辑处理”部分,那就放到这个额外的进程去处理,由于只有一个任务队列进程,就不会有冲突(多个任务队列进程的情况我们后面再说)。而这个抽象出来的任务队列框架,它也会包含一些程序库,写应用的同学只要引入程序库然后设置一下就行,框架会自动处理任务的分发,通知任务队列进程要做什么事情,然后由任务队列进程去执行。如果是定时任务,像上述所说的半小时执行一次,就由任务队列框架自己给自己添加任务了,而不用从工作进程推送任务。如此,写业务的同学不太需要关心处理函数究竟是分发到哪个进程去处理,就很方便。

网站游戏传奇_澳门棋牌网站游戏_游戏网站

高并发的演变-分布式

现在,用户量更多了,单纯一台机器无法负载,得用多台机器才行,上分布式。web同学很注重抽象和复用,也注重各功能的解耦,前面的web服务器并不支持分布式,它只能在单台机器上开多个进程(此处以python的uwsgi为例),与其大费周章的改进这个web服务器,不如再套上一层现成的支持分布式的web服务器(如Nginx、Apache),如下图所示。客户端连接Nginx,再由Nginx做反向代理和负载均衡,将用户请求转发到不同的机器上。

游戏网站_澳门棋牌网站游戏_网站游戏传奇

而对于上述示例的MMORPG游戏服务端,由于各进程都是独立的,它本身就天然支持分布式,客户端只要换不同的ip连接服务器即可进入不同的地图。

澳门棋牌网站游戏_游戏网站_网站游戏传奇

当然,“客户端要换不同的ip连接服务器”本身就不是一个好主意,某种程度说这样不是很完全的客户端服务端解耦,因为客户端也要对服务端的架构有所感知(知道哪个地址对应哪个地图)。那便改进一下,开发一个专门用于转发消息进程,叫做GateWay,如下图所示。相比于Web,这个GateWay需要单独开发,很难用类似Nginx之类通用服务器,因为它有一些定制化功能,例如它需要知道玩家在哪张地图,再把消息转发到那张地图,这是业务相关逻辑。

澳门棋牌网站游戏_网站游戏传奇_游戏网站

说完“请求处理”的分布式做法,那再看看“逻辑处理”。在“高并发的演变-多进程”中我们说到要开一个额外进程来避免冲突,那现在有多个服务器,但也只能开一个,不然也一样有冲突。

网站游戏传奇_澳门棋牌网站游戏_游戏网站

但是,现在负载高啊,用户请求这么多,得靠多台机器才能分担,只开一个任务队列进程,处理不过来,但如果多开几个,又会有冲突问题。任务队列框架需要能够处理分布式的情形,因此会采用如下图所示的方式,Web服务器将任务存进消息队列中,然后任务队列框架也开多个工作进程,分别从消息队列中取任务,然后各自执行,使得每个任务只会执行一次,而对于定时任务(例如上面的每半小时执行一次),则由任务队列框架自己定时把任务推到消息队列中,再由工作进程去执行(注意图中画了一个任务队列框架的主进程,它可用于处理定时任务的分发,当然不同框架的叫法不同,比如有些叫做beat进程)。

澳门棋牌网站游戏_网站游戏传奇_游戏网站

以python技术栈为例,消息队列可以使用RabbitMQ,也可以使用Redis实现,而诸如Celery、APScheduler便是任务队列框架,这些成熟的框架都支持配置不同类型的消息队列,配置定时任务、也支持开启分布式的工作进程。

其实从游戏服务端和web服务端对“逻辑处理”的抽象方式也可以看出,web服务端对消息延迟的敏感性是远低于游戏的。游戏需要实时交互,因此很多逻辑只能放到“地图进程”里做,数据就放在内存,直接获取,非常快;而web的这种架构下,牺牲一部分性能(延迟较高),换取了架构的解耦和框架的通用。

性能优化的演变

除了高并发,服务端也要做很多性能优化,而web静态资源(如图片)很多,它的优化是重中之重。先回到如下图所说的原始的架构,早年的网站是静态网站,http请求的内容是页面、图片这些资源,随着技术的发展,才有了动态网站,在这一演变下,web服务器是静态资源服务器的延伸,因此它天然的融合了静态资源请求和动态逻辑处理两大功能。在下图所示的服务端中,无论是静态资源请求(如程序去访问文件系统的图片),还是动态逻辑(例如增删改查数据库内容)都是同一处理方式。

网站游戏传奇_澳门棋牌网站游戏_游戏网站

再说游戏服务器,由于出现的比web晚,因此解耦的理念比早期的web更加成熟,网络游戏开发的分工也较为明确,客户端和服务端的分开,静态资源属于客户端要去处理的内容,服务端几乎不管,因此游戏的服务端很少包含静态资源,也就没有太多静态资源优化的内容。

游戏网站_澳门棋牌网站游戏_网站游戏传奇

但对于web,静态资源的加载速度影响着网页的打开速度,对用户体验影响很大,要优化到极致。如下是“高并发的演变-分布式”架构下处理静态资源方式的两个示意图,列出了两种方法。第一种是由工作进程去加载,它是“原始架构访问静态资源”的直接延伸;而第二种方式,简化工作进程的职责,将静态资源请求的任务交给Nginx。

我们会认为第二种方式的性能比第一种高,其一是转发路径更短因此响应速度更快;其二是工作进程会有不少逻辑要处理,有些处理需要时间,如果工作进程繁忙,也会影响静态资源的响应速度,而Nginx基本只做消息转发,没有复杂逻辑,因此能更快。

澳门棋牌网站游戏_游戏网站_网站游戏传奇

网站游戏传奇_澳门棋牌网站游戏_游戏网站

至于Nginx会不会负载太重处理不过来,一般不会。其一,它只是做消息转发逻辑简单;其二,其实它也是个多进程服务器,如下图所示,能够将消息分发到多个工作进程去处理而不是卡在主进程中;其三,进程间通信使用共享内存和管道实现,效率很高,只比单进程慢一点点,不像用socket通信那样慢。

网站游戏传奇_澳门棋牌网站游戏_游戏网站

因此如上图所示的结构,这也是web服务端较为稳健的生产环境部署方式。

安全性的演变

Nginx这类服务器,它经过很多项目验证,证明它拥有很高的稳定性,同时它也提供不少功能,例如把https请求转换为http、对域名处理、防火墙白名单黑名单等等功能。相比于在游戏服务器的gateway自己实现这些功能,套上一层现成的服务器显得更加便捷,因此游戏服务器也会用上Nginx(或同类服务器)。

澳门棋牌网站游戏_网站游戏传奇_游戏网站

通过本文,我们从演变的视角解释了web服务器和游戏服务器的架构差异,以及为什么会有这些差异,希望能对读者有所启发,感谢@单炒饭 给予部分修改意见。《百万在线:大型游戏服务端开发》是一本笔者出版的游戏服务端书籍,逻辑清晰,示例丰富,是游戏从业人员必读书籍。

近期文章

END

全中国只有不到1%的人关注了运维军团

你是个有眼光的人!

(由于交流群人数已超100人,需要进群的小伙伴可以添加运维小编的微信:)

澳门棋牌网站游戏_游戏网站_网站游戏传奇

如果你喜欢我们的文章,请转发到朋友圈

网站游戏传奇_澳门棋牌网站游戏_游戏网站

网站游戏传奇_游戏网站_澳门棋牌网站游戏

游戏网站_澳门棋牌网站游戏_网站游戏传奇

澳门棋牌网站游戏_游戏网站_网站游戏传奇

澳门棋牌网站游戏_游戏网站_网站游戏传奇

网站游戏传奇_游戏网站_澳门棋牌网站游戏

公众号

ywjtshare

运维军团

游戏网站_网站游戏传奇_澳门棋牌网站游戏

专注运维技术与传承,分享丰富原创干货