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运行架构

Pomelo Structure
多进程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
    应用的定义,组件管理,上下文配置
Pomelo Structure
柚子框架

架构目标

  • 服务器进程的抽象与扩展
    Web应用中每个服务器是无状态且对等的,开发者无需通过框架或容器来管理服务器。但游戏不同,游戏可能需要包含多种不同类型的服务器,每种服务器在数量上也可能有不同的需求。这就需要框架对服务器进行抽象和解耦,支持服务器类型和数量上的扩展。
  • 客户端的请求响应、广播
    客户端的请求响应与Web应用类似,但游戏框架是基于长连接的,实现模式与HTTP请求有一定差异。广播是游戏服务器最频繁的操作,需要方便且高性能的API。
  • 服务器间的通讯和调用
    尽管框架尽量避免跨进程调用,但进程间的通讯是不可避免的,因此需要一个方便好用的RPC框架做支撑。
  • 松耦合可插拔
    框架支持以组件的形式插入任何第三方组件,也支持加入自定义的路由规则,自定义的过滤器等。

框架优势

  • 可伸缩性好
    架构采用多进程单线程的运行架构,扩展服务器方便。
    Node.js的网络IO优势提供了高可伸缩性。
  • 使用方便
    开房模式与Web应用的开发类似,都是基于Convention Over Configuration的理念,零配置。
  • 松耦合可扩展
    遵循Node.js微模块原则,框架所使用的类库组件都是以NPM Module的形式扩展进来。

相关文章: