游戏服务器框架设计
Ø 序言
人们在认识事物的时候,一般都是先从大致的骨架开始,然后再到具体的细节,金字塔原理中用的比较多的就是自上而下的分析方法,这个方法放在放之四海而皆准。那么回到我们游戏服务器开发上面,也是如此。那么如何设计和选择服务器架构以及有啥需要注意的呢? 这是本文章要解决的问题。
文章主要目标人群是,对服务器框架设计感兴趣,有从事过游戏框架设计的同学。
文章内容,介绍五大设计原则以及给出两个示例,最后做总结。
Ø 设计原则
设计原则其实也是在设计时需要考虑的因素,过度设计是加重工作量的元凶,设计本质就是为了解决问题而存在的,下面列出了5大比较典型的原则。
1. 业务逻辑开发
a) 比如游戏为了增加存储,你就需要考虑使用内存数据库还是弄个数据库网关服务器来处理。
b) 比如游戏为了管理游戏玩家账号,以及支持对平台账号的接入,那么就需要账号服务器。
c) 比如游戏为了管理游戏玩家订单和跟踪付费情况,可能就需要支付服务器,如果游戏类型是计时收费的话,那么可能会需要计时服务器。
2. 运营维护
a) 配置
这里牵涉到静态配置和动态配置的问题,假设现在有一台网关服务器和三台游戏逻辑服务器,静态配置的话,就是网关服务器这边写死只连接这三台服务器,然后让网关服务器主动去连接,动态配置的话,就是让这三台服务器知道这个网关服务器的地址,然后自己在启动的时候去连接。
b) 开启或者关闭顺序
这主要是看各个服务器上面负责什么功能以及服务器上面的相关功能,拿游戏登陆服务器,游戏逻辑服以及数据库网关服务器这三个服务器的架构来说,比如开启的时候,你尽可能地跟玩家登陆连接的顺序相反, 一般都是数据库网关服务器,然后才是游戏逻辑服,最后才是游戏登陆服务器,其实就是防止玩家过早地登陆进来,却发现数据还没有准备好。
关闭的顺序其实就是相反的,主要原则就是让数据尽可能地保存好,并且让玩家不再进来。
c) 动态增删改
增删改分为三部分:1)增加一台服务器,2)减少一台服务器,3)修改服务器信息,比如前面提到的静态配置,就是不太方便增加服务器,要增加一台服务器,需要更新网关服务器的配置表,然后让网关服务器重新连接到新的服务器,而动态配置的话,就非常方便,让新增的服务器发起到网关服务器就好了。无需更改配置。
d) 服务器管理
服务器的管理主要在服务器的在线离线状态的管理,中心服务器(用来管理其它服务器)必须实时知道所管理服务器的状态,比如网关服务器必须要实时知道游戏逻辑服的状态,这样才好更新到登陆服务器上面,更改服务器状态。基本上在众多同级服务器上面基本上都会有个中心服务器。
3. 性能效率
这需要权衡利弊和性能优劣,比如在ARPG游戏逻辑服务器里面大量的消耗在AI上面,那么就要考虑给弄个线程还是进程,这同样适用于聊天功能,有一些聊天功能,或许可以选择使用UDP来作为网络层通讯方式。是否将功能模块设计成单独进程,这需要权衡,虽然可能在运营中会部署内网,相互之间是通过发消息的,类似于共享内存,但是还是会产生一些消耗的。
4. 负载均衡
这里包括两个部分,硬件负载均衡,和软件负载均衡。硬件负载均衡主要是指路由器。软件负载均衡主要有几种软件,nginx/lvs/haproxy/dns, 负载均衡的策略,可以参考nginx 的负载均衡,主要有round-robin, least-connected, 以及ip-hash等。
一般来说,游戏中大都是二级负载,首先是在登陆这边负载一次,然后再在进入游戏逻辑服那边负载一次,这样就够了。
5. 安全性
这里说下网关服务器,其它地方也叫前置服务器,front-end servers,,这个有几个好处:1)隐藏游戏逻辑服的连接信息. 2) 统筹游戏逻辑服的负载信息。
Ø 服务器框架示例
1) 无中心服务器架构
2) 有中心服务器架构
Ø 结论
服务器框架设计更像一门艺术,需要在解决问题的同时,又需要注意平衡得失。