Pomelo是游戏服务器框架,本质上也是高实时、高扩展、多进程的应用框架,除了在提供的库部分有游戏专用的库,其余部分框架完全可用于开发高实时的应用。而且与现有的Node.js高实时应用框架如Derby、Socketstream、Meteor等相比具有更好的可伸缩性。
Pomelo为什么采用Node.js开发?
Node.js自身特点与游戏服的特性惊人的吻合,在Node.js官方定义中,fast、scalable、realtime、network这几个特性都非常符合游戏服的要求,游戏服是网络密集型的应用,对实时性要求极高,Node.js网络IO上的优势完全可以满足这点。
使用Node.js开发游戏服的优势
- IO与可伸缩性
IO密集型的应用采用Node.js最合适,可以达到最好的可伸缩性。 - 多进程单线程
Node.js天生采用单线程,使其在处理复杂逻辑时无需考虑线程同步、锁、死锁等问题,减少了很少逻辑错误。由多进程Node.js组成的服务器群是最理想的应用架构。 - 语言优势
使用JavaScript开发可以实现快速迭代,若客户端使用HTML5,更可实现代码共用。
游戏服的运行架构
高可扩展的游戏运行架构必须是多进程的,Google的Gritsgame,Mozilla的Browserquest都采用了Node.js作为游戏服开发语言,它们都采用了单进程的Node.js服务器,由于缺乏扩展性,使它们可以支撑的在线用户数量是有限的。而多进程架构可以很好的实现游戏服的可扩展性,达到支撑较多的在线用户、降低服务器压力等要求。
典型多进程MMO运行架构
- 客户端通过websocket长连接到前端连接器,连接器负责承载连接,并将request转发到后端服务器群。
- 后端服务器群包含按场景分区的场景服务器area,聊天服务器chat、状态服务器status,这些服务器负责各自的业务逻辑。
- 后端服务器负责处理完逻辑后将结果返回给前端连接器,再由连接器广播回给客户端。
- master负责统一管理这些服务器,包括各服务器的启动、监控、关闭等功能。
架构将游戏服做了抽象,抽象成两类:前端服务器、后端服务器
前端服务器(frontend server)
- 负责承载客户端请求的连接
- 维护Session会话信息
- 将请求转发到后端
- 将后端需广播的消息发送到前端
后端服务器(backend server)
- 处理业务逻辑包括RPC和前端请求的逻辑
- 将消息推送回前端
游戏运行架构 & Web应用运行架构
| 游戏运行架构 | Web运行架构 |
|---|---|
| 前端服务器 | Web服务器,如Apache/Nginx |
| 后端服务器 | 应用服务器,如Tomcat |
游戏运行架构与Web应用运行架构的区别
长连接与短连接
Web应用使用基于HTTP的短连接以达到最大的可扩展性,游戏应用采用基于Socket(WebSocket)的长连接以达到最大的实时性。分区策略
Web应用的分区可根据负载均衡自行决定,游戏则是基于场景的分区模式,这使同场景的玩家跑在一个进程内以达到最少的跨进程调用。有无状态
Web应用是无状态的,可以达到无限的扩展。游戏应用是有状态的,由于基于场景的分区策略,游戏的请求必须路由到指定的服务器,这也使游戏达不到Web应用同样的可扩展性。通讯方式
Web应用基于请求响应模式,游戏应用则更为频繁的使用广播,由于玩家在游戏里的行动要求实时地通知场景中的其它玩家,必须通过广播的模式实时发送,这也使游戏在网路通信上的要求高于Web应用。
框架定位
Pomelo是一个轻量级的服务器框架,最合适的应用领域是网页游戏、社交游戏、移动游戏的服务端。不推荐将Pomelo作为大型MMORPG游戏开发,尤其是大型3D游戏,这需要像BigWorld商用引擎来支撑。
框架特性
- 基于Socket.io开发
- 多进程架构:支持MMO场景分区和其他各类分区策略
- 服务器扩展:快速扩展服务器类型和数量。
- 通讯机制:请求、响应、广播
- 扩展组件
框架组成
- Server Management
多进程分布式游戏服武器,各游戏Server进程的管理是框架很重要的部分,框架公国抽象使服务器的管理非常容易。 - Network
请求、响应、广播、RPC、Session管理 - Application
应用的定义,组件管理,上下文配置
架构目标
- 服务器进程的抽象与扩展
Web应用中每个服务器是无状态且对等的,开发者无需通过框架或容器来管理服务器。但游戏不同,游戏可能需要包含多种不同类型的服务器,每种服务器在数量上也可能有不同的需求。这就需要框架对服务器进行抽象和解耦,支持服务器类型和数量上的扩展。 - 客户端的请求响应、广播
客户端的请求响应与Web应用类似,但游戏框架是基于长连接的,实现模式与HTTP请求有一定差异。广播是游戏服务器最频繁的操作,需要方便且高性能的API。 - 服务器间的通讯和调用
尽管框架尽量避免跨进程调用,但进程间的通讯是不可避免的,因此需要一个方便好用的RPC框架做支撑。 - 松耦合可插拔
框架支持以组件的形式插入任何第三方组件,也支持加入自定义的路由规则,自定义的过滤器等。
框架优势
- 可伸缩性好
架构采用多进程单线程的运行架构,扩展服务器方便。
Node.js的网络IO优势提供了高可伸缩性。 - 使用方便
开房模式与Web应用的开发类似,都是基于Convention Over Configuration的理念,零配置。 - 松耦合可扩展
遵循Node.js微模块原则,框架所使用的类库组件都是以NPM Module的形式扩展进来。