超低数据传输量,服务器端动态扩展——Node.js 开源游戏框架升级至 0.3 版

  • 彭超

2013 年 3 月 8 日

话题:JavaScriptNode.js语言 & 开发

在这个广大女性可以放假半天的特别节日里,网易杭州研究院的小伙子们没能休息,反而热火朝天的发布了 GitHub 上广受好评的Node.js 游戏框架 pomelo的最新版本 0.3 版。

如果你还不了解这款“柚子”框架,请参见 InfoQ 对框架作者,杭州网易研究院高级研究员谢骋超的专访: 网易 NodeJS 开源游戏框架 pomelo 访谈,及他在 InfoQ 连载的“深入浅出 node.js 游戏服务器开发”系列文章。

值得一提的是谢骋超也是本届QCon 北京 2013 大会的受邀演讲嘉宾,将会在Node.js 专题中分享 Pomelo 框架的心得体会。

下面让我们了解一下 pomelo 框架的更新内容:

Pomelo 0.3 版为移动端性能优化做了很多工作, 新协议的数据包压缩后的传输量仅为 0.2 版的 20%, 并保留了 0.2 版基于 socket.io 的传输协议。socket.io 对开发浏览器端器端的实时应用非常适合,而 socket(websocket)、protobuf、二进制等协议则对移动端、桌面客户端的开发更具优势。pomelo 对它们的同时支持使同时支持浏览器、移动、桌面客户端的高实时应用或游戏变得非常容易。下面让我们看看 pomelo 的新版本特性:

1. 新协议支持

0.3 版 Pomelo 开始支持二进制协议,并支持对请求 route 的字典压缩和请求内容进行 protobuf 压缩。0.3 版同时兼容以前版本基于 socket.io 的通讯协议。通过在应用中配置不同的 connector component 来实现协议的切换或共存。

目前 Pomelo 服务器提供两类 connector:sioconnector 和 hybridconnector,分别对于基于 socket.io 和二进制的通讯。

2. 动态服务器扩展

Pomelo 0.3 版开始支持动态增加和移除服务器进程机制,并提供相应的命令行工具。每台新增的服务器都会连接到 master 服务器上进行注册。Master 再将新服务器的信息广播给集群中的所有服务器进程。原有的服务器进程再对新增服务器事件进行响应。

当一个服务器进程接收到一个新增服务器的消息后,会将该服务器信息保存到本地的 app 上下文中,之后可以通过 app.getServers 等系列方法查看到新服务器的信息,从而影响之后的消息路由。

如果新加的服务器的类型之前尚未存在于 app 上下文中,Pomelo 会尝试着为其创建对应的 rpc 代理对象。如果该类型服务器需要提供 rpc 服务,则需要在约定的目录(servers/server-type/remote/)下提供 rpc 服务代码。

动态移除服务器进程的流程也与上面类似,当服务器断开与 master 的连接后,master 会将该服务器的信息广播给其他进程,其他进程再进行相应处理。

3. 其他新特性

  • servers.json 配置文件的修改:随着 Pomelo 支持协议的增多,配置文件原先定义的 wsPort(代表 websocket port)已不适用,现调整为 clientPort。
  • 3.2 新增 channel 广播接口:ChannelService 新增 broadcast 接口,适用于给全世界广播的场景。
  • 新增 session 获取接口:LocalSessionService 新增根据 session id 获取 localSession 接口 get 和根据 user id 获取 localSession 接口 getByUid。
  • javascript 客户端支持:
    • 支持两类 javascript 客户端 --- socket.io 与 websocket:目前 socket.io 与 websocket 两套协议在 javascript 都有用武之地。socket.io 的兼容好,可以适应各种浏览器,适合开发类似聊天室这样的高实时应用。websocket 客户端则在数据压缩上做到了很多优化,大大减少了消息的传输量,适合开发基于 HTML 5 的游戏应用。
    • 客户端 javscript build 系统:以前的 pomelo-jsclient 版本管理异常混乱, 经常将好几个文件复制到不同的项目各自修改。因此我们引入了 component 来管理 js 的库。 客户端 js 代码目前采用以 component 的形式统一管理与维护。
  • 其它客户端支持:
    • 提供新的 C 客户端,支持 socket 协议,基于 libuv 开发,提供了完整的数据与消息压缩, 支持 cocos2d-x
    • 其余客户端,如 flash,android, ios, unity3d, 目前还只支持 socket.io 协议,后续会推出基于 socket 协议客户端

关于 pomelo 此次升级的其他相关文章,可以参考该项目的 GitHub 页面:

JavaScriptNode.js语言 & 开发