游戏服务器与普通服务器有什么区别?相比于我们常见的数据中心的普通Web服务器,网络游戏服务器(如英雄联盟,魔兽世界)有什么特别的地方?Web服务器基本是无状态的. 游戏服务器是强状态的, 耦合自己不说, 还要耦合别人, 别的大区…
游戏服务器(网络游戏服务器)和web服务器的最大区别是:web服务器每个client都是独立的,游戏服务器不同client是有交互有状态,会实时地互相影响。这导致很多设计上的差异。
我个人租过的配置最高的服务器:16核CPU+64G内存,外加50M独享电信宽带。这种配置在武装突袭的服务器中勉强算是个中低配,可以同时容纳七八十个玩家在线。这种机器要是用来搭建个人的网站那绝对算是豪华配置了。顶个日均万儿八千个UV就是毛毛雨。要我说有什么区别,那就是游戏服务器要求更高。尤其对带宽要求很高。
普通服务器,都是客户与系统之间的数据交换与逻辑,不会涉及玩家与玩家之间的状态,买家A只需要和电商平台系统来进行数据操作就可以了,无需要管买家B的状态。
网络游戏服务器就不一样了,它不是单纯的玩家与系统之间的数据处理,还有玩家与玩家之间的,比如玩家A打死了一只怪,我要告诉玩家B(能看见玩家A的人)。
游戏服务器和应用服务器很大的不一样在于处理问题完全不是同一个。游戏服务器就是长连接,多玩家之间数据如何交换,同步,推动游戏逻辑进度等。应用服务器走 短连接,处理完业务就关闭释放,下次再处理的时候再连接请求,所以技术架构,开发方式都完全不一样。
提升并发量负载量的方式也不一样, 对于普通的服务器,提升并发,加多机器,反向代理等,相对来说部署更容易一些。而游戏服务器扩容,增加负载,考虑的就多些,比如两个玩家有可能在一个服务器上游戏,两个玩家有可能组队等。
游戏服务器与普通服务器除了基础知识相同以外,处理思想和处理的问题是完全不一样的:
1、并发架构的影响
在高并发下,对client请求进行负载均衡并不如web那么简单,因为client状态会互相影响,并且可能共享写数据甚至有时序依赖。大型mmorpg通常是长连接,并发服务数通常要远小于web服务器 。根源就是实时性和强交互性的限制,两者要求越低的游戏,并发就可以做得越高。
web服务运算较少,io密集,读多写少。游戏服计算和io都密集,读写都频繁
2、对代码风格的影响
比如开发web服务,基于nginx的openresty就很好用,利用了Lua的协程和异步io,写起来很流畅而不失性能。但用来做游戏服务器,协程却可能是个坑,因为游戏依赖很多上下文环境,当协程被唤醒时,上下文环境改变,协程的代码风格很容易用了旧变量导致逻辑错误。
游戏服务器:CPU密集(Redis:内存状态值读写),网络IO密集(广播).
网站服务器:状态比较少(Redis:会话信息),数据库IO密集.
做过游戏服务器的开发,也做过一般的互联网服务器的开发,在我看来两者的区别主要有两点:
1)游戏服务器比一般的服务器要保存更多的状态:玩家的属性这些自不必说,一般的IM服务也会有,还有一些马上就会变化的数据,比如某个玩家的生命值,发技能前后的法力值等等,这些值区别于一般的属性值如名字,ID这些的差异在于,会经常性的变化,还会参与到逻辑的计算中,比如你一个多少等级的玩家吃了什么东西之后战力值变化为多少,打在一个多少属性的玩家身上会不会被他闪避,会不会产生暴击….
游戏逻辑中的战斗技能计算是很大的一个点,我不太熟悉这块就不展开多说了.可以看到,游戏逻辑的CPU计算是非常多的.
2)游戏服务中,每个玩家不是独立存在的,而是很有可能会与其他玩家发生状态的交互,一般的服务器比如什么的,你一个请求过来查你的数据,和别人的请求是独立的,并没有什么交互.
客户端之间会有交互这一点,举最简单的例子,一个人在一个场景里面说了一句话,那么同一个屏幕的玩家也需要能够看到他说的这句话.此时游戏服务器就需要判断,多远的距离以内的玩家,会认定为是”同屏幕”的玩家,需要向这些玩家广播这个玩家说的这句话.
这个广播就比较麻烦了.首先,计算哪些玩家在”同屏幕”,就是我们在第一点提到的玩家身上某些经常变化的属性需要做的运算,在这里需要根据玩家的坐标,找出来跟在同屏幕的玩家,用到的是AOI的概念,感兴趣的可以看看云风的 BLOG: 开发笔记 (13) : AOI 服务的设计与实现 .另外,找到了这些需要接收这个消息的玩家之后,将消息转发给它们又是一个IO密集的操作,假如场景中有10个人,那么一句话就需要同时广播给另外9个人,假如有100人,1000人呢,量就更大了.所以同样的一个硬件配置的服务器,可能跑Nginx可以同时处理上万的链接,但是对于一个游戏服务器就只有1,2千了,就是因为游戏服务器是一个CPU密集而且IO密集的服务器类型.