游戏服务器架构设计进化
2022-11-05 20:27:34 【

一、游戏服务器特征

游戏服务器是一个长期运行的程序,需要拥有可以处理高并发情况下的网络请求,多用户情况下的内存,缓存模型,以及对应数据库的保存,或者缓存策略,还需要能快速相应游戏客户端请求的能力。

因此这种业务需求要特别关注稳定和性能,我们往往会关注对服务器端的内存和CPU的使用,以求在特定业务代码下,能尽量满足高承载低响应延迟的需求。最基本的做法就是“空间换时间”,用各种缓存的方式来以求得CPU和内存空间上的平衡。这类程序如果需要多个协作来提高承载能力,则还要关注部署和扩容的便利性;同时,还需要考虑如何实现某种程度容灾需求。由于多进程协同工作,也带来了开发的复杂度,这也是需要关注的问题。        



二、游戏服务器架构要素

如何充分利用CPU、内存、网卡的设计成为设计游戏服务端架构需要考虑的基本条件。

逻辑架构:设计如何使用进程、线程、协程这些对于CPU调度的方案。选择同步、异步等不同的编程模型,以提高服务器的稳定性和承载量。可以分区分服,也可以采用世界服的方式,将相同功能模块划分到不同的服务器来处理。


内存架构:主要决定服务器如何使用内存,以最大化利用服务器端内存来提高承载量,降低服务延迟, 你需要设计合理的内存管理模型,防止服务器在长期运行过程中产生大量的内存碎片。


通信模式:决定使用何种方式通讯。基于游戏类型不同采用不同的通信模式,比如对于一些弱交互类型的游戏可以使用http/https, 强交互性的可以使用tcp,udp,kcp,websocket等。


三、游戏服务器演化进程

休闲弱交互弱联网游戏类型

对于弱联网游戏,实际上客户端不需要维护和服务器之间的长连接,需要通知服务器数据变化的时候,发个http请求等服务器响应返回即可。


所以这种无状态的服务器架构也比较简单,常规的操作都是使用web服务器,再在支持web框架的相关语言代码之上写逻辑。



这种服务器架构采用nginx/apache负载集群支持服务器的水平扩展,memcache/redis做缓存。



长连接游戏服务器

长连接游戏中消息传送的频率和速度上都快于弱联网游戏,长链接网游的架构经过几代的迭代,类型也变得日益丰富,以下为每一代服务器的特点以及架构模式。


1)、单线程无阻塞的服务器


最早的游戏服务器是1978年,英国著名的财经学校University of Essex的学生 Roy Trubshaw编写了世界上第一个游戏《MUD1》。


MUD1 是第一款真正意义上的实时多人交互的网络游戏, 纯文字的世界,没有任何图片。


MUDOS使用单线程无阻塞套接字来服务所有玩家,逻辑处理采用单线程tick轮询,所有玩家的请求都发到同一个线程去处理,主线程每隔1秒钟更新一次所有对象(网络收发,对象状态,刷新地图,刷新NPC)。用户使用 Telnet之类的客户端用 Tcp协议连接到 MUDOS上,使用纯文字进行游戏,每条指令用回车进行分割。这样的系统在当时每台服务器承载个4000人同时游戏。  


2) 、分区的网游服务器

2000年左右,随着图形界面的出现,游戏更多的采用图形界面与用户交互。此时随着在线人数的增加和游戏数据的增加,服务器变得不抗重负。于是就有了分服模型。分服模型结构如下:


分服模型是游戏服务器中最典型的模型。


之前随着玩家数量的不断快速膨胀,单服的内存,CPU,网络也负载越来越大的压力,直至崩溃宕机,为了缓解服务器压力,给玩家创造一个更为流畅舒适的游戏环境, 就形成了后来的分服的架构设计:


每个服务器的帐号是独立的,每台服务器用户的状态都是不一样的,一个服就是一个世界,大家各不牵扯。


后来游戏玩家呼吁要跨服战斗,于是就出现了跨服战,再加上随着游戏的运行,单个服务器的游戏活跃玩家越来越少,所以后期就有了服务器的合并以及迁移,慢慢的以服务器的开放、合并形成了一套成熟的运营手段。目前多数页游,手游游戏还采用分服的结构来架设服务器。


实际上我之前参与过的《摩尔庄园》和《赛尔号》这种页游都是采用的分服结构来缓解玩家都登陆到一个服务器而造成的网络拥挤。(希望大家不要喷我,当时为什么要做儿童页游,实际上我也是被逼的,工作室总监下达KPI,策划就不断的出策划案,我硬着头皮也不得不写代码)


还有后来和创业团队一起主导开发的《忍者Q传》,《超神王者》等经典手游也是通过分区服的方式来设计服务器架构。


说到这里,讲一个题外话,就是关于合服问题,实际上在中后期,开了太多的服,可能导致部分老服玩家会往新服跑,或者老服玩家不断的流失,造成一些服务器的资源浪费,同时对于一些有交互性玩法的系统,可能会降低玩家的活跃度和参与度,因此运营会不定期的看玩家的DAU等一些关键参数来判断要合并哪些服务器,技术同学写合服工具,来将不同区服的玩家来合并到一起(一般在设计分区服的服务器架构时,生成玩家playerid的时候都是按照区服ID,时间戳,和自增ID 来参与位运算,这样每个区服生成的玩家playerid都不会重复,而且也能通过playerid中位的逆运算获取玩家所在区服)。


分区服游戏的架构进化


在后来的分区服的游戏架构里,我们将维护客户端的网络连接部分剥离出来,形成了后来的网关,网关部分从gameserver里分离成单端的gate服务器,DB部分也从gameserver里分离为DB服务器。


让用户统一去连接一个网关服务器(实际上也就是一个区服对应一个网关,或者多个区对应一个网关),再由网关服务器转发数据到后端游戏服务器。而游戏服务器之间数据交换也统一连接到网关进行交换。所有有DB交互的,都连接到DB服务器来代理处理。



】【打印关闭】 【返回顶部
上一篇没有了 下一篇游戏服务器数据是通用吗?