From faa27f7220de76c48372cd227601953f066fba04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=20=E6=B2=BB=E7=A6=B9?= 一个真正高可扩展的游戏运行架构必须是多进程的。google的gritsgame, mozilla的browserquest 都采用了node.js作为游戏服务器开发语言, 但它们都采用了单进程的node.js服务器,缺乏扩展性,这使它们可以支撑的在线用户数量是很有限的(这两个游戏主要是作为HTML5游戏的demo)。而多进程的架构可以很好的实现游戏服务器的的扩展性,达到支撑较多在线用户、降低服务器压力等要求。 说明: 上图中的方块表示进程, 定义上等同于“服务器“ pinus framework的组成架构如图所示: 该架构把游戏服务器做了抽象, 抽象成为两类:前端服务器和后端服务器, 如图: 前端服务器(frontend)的职责: 利用目录结构与服务器对应的形式, 可以快速实现服务器的抽象。 以下是示例图:
-# 游戏服务器的运行架构
# 一个典型的多进程MMO运行架构, 如下图所示:
-

# 运行架构说明:
@@ -77,7 +77,7 @@
# pinus的框架介绍


# 服务器(进程)的抽象与扩展介绍
# 服务器的抽象与分类


# 服务器抽象的实现


图中的connector, area, chat三个目录代表三类服务器类型, 每个目录下的handler与remote决定了这个服务器的行为(对外接口)。 开发者只要往handler与remote目录填代码, 就可以实现某一类的服务器。这让服务器实现起来非常方便。 让服务器动起来, 只要填一份配置文件servers.json就可以让服务器快速动起来。 配置文件内容如下所示:
@@ -132,13 +132,13 @@所有的web应用框架都实现了请求与响应的抽象。尽管游戏应用是基于长连接的, 但请求与响应的抽象跟web应用很类似。 下图的代码是一个request请求示例:
-

请求的api与web应用的ajax请求很象,基于Convention over configuration的原则, 请求不需要任何配置。 如下图所示,请求的route字符串:chat.chatHandler.send, 它可以将请求分发到chat服务器上chatHandler文件定义的send方法。
Pinus的框架里还实现了request的filter机制,广播/组播机制,详细介绍见pinus框架参考。
架构中各服务器之间的通讯主要是通过底层RPC框架来完成的,该RPC框架主要解决了进程间消息的路由和RPC底层通讯协议的选择两个问题。 服务器间的RPC调用也实现了零配置。实例如下图所示:
-

上图的remote目录里定义了一个RPC接口: chatRemote.js,它的接口定义如下:
chatRemote.kick = function(uid, player, cb) { |
其它服务器(RPC客户端)只要通过以下接口就可以实现RPC调用:
@@ -149,7 +149,7 @@

用户只要实现component相关的接口: start, afterStart, stop, 就可以加载自定义的组件:
app.load([name], comp, [opts]) |
一个真正高可扩展的游戏运行架构必须是多进程的。google的gritsgame, mozilla的browserquest 都采用了node.js作为游戏服务器开发语言, 但它们都采用了单进程的node.js服务器,缺乏扩展性,这使它们可以支撑的在线用户数量是很有限的(这两个游戏主要是作为HTML5游戏的demo)。而多进程的架构可以很好的实现游戏服务器的的扩展性,达到支撑较多在线用户、降低服务器压力等要求。