游戏服务器概述
没有开发过游戏的人,会觉得游戏服务器是一个很神秘的东西。 但实际上,它并不比网络服务器复杂。 无非就是为客户端提供网络请求服务。 本质上,它只是一个基于长连接的socket服务器。 当然,在逻辑复杂度、消息量、实时性等方面都有更高的要求。
游戏服务器是复杂的套接字服务器。
如果说web服务器的本质是http服务器,那么游戏服务器的本质就是socket服务器。 它使用套接字通信来实现服务器和客户端之间的交互。 其实很多游戏都是直接基于native socket开发的。 与简单的socket server相比,它承担了更多繁重的任务:
为什么纯套接字服务器不够好?
很多web应用不会基于原生的http服务器来构建,一般都是基于某种类型的应用服务器(比如tomcat),并且会使用一些开发框架来简化web开发。 同样web游戏开发框架,一般游戏服务器的开发都会在socket服务器上封装一套框架或者类似的应用服务器。 为什么使用原生socket接口开发还不够好?
使用框架简化游戏服务器开发
一个好的框架可以大大简化游戏服务器的工作。 除了游戏本身的逻辑,大部分工作都可以用框架来解决。 服务器端的抽象、可扩展性、可扩展性都可以通过框架来解决。 游戏服务器框架也承担了应用服务器的功能。 框架可以看做是一个容器,只要把符合容器标准的代码丢进去,容器就会跑起来。 它天然具有抽象、可扩展、监控和管理的能力。
游戏服务器框架介绍
开源社区中web服务器框架数不胜数,游戏客户端框架和类库更是数不胜数,唯独游戏服务器框架少之又少。 零星有一些类库,但几乎没有完整的解决方案。 我们不得不拿商业解决方案中的一些框架进行类比:
太阳红矮星
RedDwarf 是唯一一个完整的开源游戏服务器框架,由 sun 出品。 不幸的是,它在并入 Oracle 后就已经停产了。 在设计方面,RedDwarf 是一个分布式架构。 它在分布式数据存储和任务管理上投入了太多的精力,而且做得太理想了。 例如,动态任务迁移功能的实现非常复杂,但在实际应用中并不是必须的。 到达。 它在可扩展性和性能设计方面并不理想。 就这样红矮星死了。
Smartfox服务器
SmartfoxServer是意大利游戏公司gotoAndPlay()推出的商业游戏服务器。 它基于java开发,看起来与Tomcat等Web应用服务器非常相似。 Smartfox 支持各种客户端并有一些成功案例。 在服务端封装和监控管理方面实现的很好。 但它在可扩展性方面并不理想。 Smartfox虽然也支持Cluster模式,但是它的扩展方式是基于jvm内存复制的。 也没有实现基于场景划分的传统MMORPG解决方案。 Smartfox 有一个免费版本,但它根本不是开源的。 而它的免费版(不能满足高并发用户的要求)很大程度上是为了吸引开发者最终购买它的付费版。 不限制在线人数的付费版售价达到3500美元。
大世界
Bigworld 是由澳大利亚Bigworld 公司开发的一款完整的3d MMORPG 游戏解决方案。 该解决方案包括客户端和服务器。 Bigworld非常强大,在动态负载均衡和容错方面做了大量的工作。 可扩展性非常强大。 它的缺点是过于重量级,对硬件要求高,而且非常昂贵。 Bigworld是专门为3d MMORPG游戏定制的,但不适合中小游戏的开发。
柚
Pomelo是网易于2012年11月推出的一款开源游戏服务器,是基于node.js开发的高性能、可扩展、轻量级的游戏服务器框架。 其主要优点如下:
目前Pomelo的主要不足是上线时间还很短,部分功能还在完善中,支持的客户端类型还比较有限。 目前支持HTML5、ios、android、untiy3d等4种客户端,未来将支持更多客户端类型。
游戏服务器可扩展性探讨
无论是Web应用还是游戏服务器,可扩展性永远是最重要的指标,也是最难解决的问题。 涉及到系统运行架构的构建和各种优化策略。 只有设计好可扩展性,才能保证游戏的规模、并发在线人数、响应时间等参数。
为什么游戏服务器的可扩展性远不如 Web?
与Web应用几乎无限可扩展的架构(前提是架构设计得很好)相比,游戏服务器的可扩展性要差得多。 那么是什么因素导致游戏无法达到Web应用的可扩展性呢? 注意:本文提到的Web应用不包括聊天等高实时性的Web应用。 高实时web可以看成是一种逻辑比较简单的游戏。
长连接实时响应
Web 应用程序基于请求/响应短连接模式。 占用的资源比一直保持长连接的游戏服务器要少很多。 Web应用可以使用短连接模式的原因如下:
游戏应用只能使用长连接,原因如下:
在高并发长连接服务的解决方案中,除了传统的C语言(过于重量级)实现外,使用最多的是erlang和node.js。 两者性能指标相近,node.js在易用性方面无疑胜出太多。
最近在微博上看到Shigo可以支持100万并发web游戏开发框架,node.js也可以做到同样的数据,Node.js w/1M并发! 有node.js长连接数据,占用16G内存,但CPU还远远没有满。
交互式邻接和分区策略
普通Web应用在交互上没有邻接概念,所有用户交互平等,交互频率不受地域限制。 这不是游戏的情况。 游戏交互与玩家在地图(场景)上的位置密切相关。 比如两个玩家可以互相PK或者组队在相邻的地方打怪。 这种相邻交互的频率非常高,对实时性的要求也非常高,这就需要相邻玩家分布在同一个进程中。 于是就有了按场景分区的策略,如图:
一个过程中可以有一个场景,也可以有多个场景。 此实现会带来以下问题:
播送
游戏内广播非常昂贵。 玩家的输入和输出是不对等的,玩家需要把这个消息实时推送给所有其他看到这个玩家的玩家。 如果场景中人少,广播发送的消息数量不会太多音乐音效,但如果人数达到非常密集的程度,广播的频率就会呈二次方增长。 如图所示:
如果场景中有1000名玩家,每人发送一条消息,如果其他玩家需要看到,那么推送的消息数量将高达100万条,足以炸掉任何一个服务器。
这个问题的解决方案:
这样广播逻辑和具体的流程逻辑就不会互相影响,而且由于只有后端场景服务器是有状态的,负责广播的前端服务器还是无状态的,所以前端服务器可以无限扩大。
实时报价
实时游戏的服务器一般需要一个计时tick来执行计时任务。 对于游戏的实时性,一般要求tick时间在100ms以内。 这些任务包括以下逻辑:
由于实时100ms的限制,这个real-time tick的执行时间必须远小于100ms,所以单个进程中的大量数据会被限制。
高度可扩展的操作架构
经过以上分析。 我们可以得到当前运行的架构,如下图:
运行结构说明:
这种运行架构符合刚刚提到的可扩展性原则:
上面提到的四种游戏服务器框架中,只有bigworld和pomelo符合这种架构,当然bigworld的实现更加复杂。 现在的问题是这个运行架构是分布式架构,并不简单,带来了以下问题:
node.js、pomelo 和游戏服务器
Node.js的特性与游戏服务器非常吻合。 下面列出:
Pomelo是一个基于node.js的游戏服务器框架,在灵活性、可扩展性和轻量级调试方面具有无可比拟的优势。 让我们简单回答一下第三章末尾的一些问题:
在本系列的后续文章中,我们将讨论 pomelo 是如何实现上述便捷功能的人物立绘,以及这些设计带来的启发。
概括
本文分析了游戏服务器框架的市场现状,高度可扩展的游戏服务器架构的设计原则和运行架构。 Node.js和pomelo在解决高并发和分布式架构中起到的作用。 下面我们将深入分析pomelo在解决复杂的游戏服务器运行架构方面提供了哪些便利。