木匣子

Web/Game/Programming/Life etc.

几张 Pomelo 框架的序列图

最近一年来,强连接的手机网游慢慢多起来了,这也促使我开始对它们使用的技术好奇起来。这个月研究了一些有关游戏服务端的东西。读了一些相关的书籍,例如《大型多人在线游戏开发》。这才发觉目前工作中使用的技术与之相差甚远。现在在开发的项目简单说就是带网络储存功能的单机游戏罢了,想直接加入玩家之间流畅的实时对战的功能几乎不可能。所以乎我决定深入学习一下 MMORPG 相关的技术以及框架。

网易开源的 Pomelo 游戏服务端框架提供了一个不错的学习环境,而且是使用我最熟悉的 javascript 编写而成。于是我打算将它作为一个目标好好研究一下,看看它是如何被组织、运作的。

Pomelo 的官方 Wiki 提供了许多不错的文档,对框架的描述也还算到位。不过文档中展示的所有时序图使用了非标准的过程调用画法,箭头十分混乱,导致阅读起来非常困难。所以我打算自己通读一遍源码后整理几张重要的时序图,以便之后翻阅。

Pomelo Initial

Pomelo 的每个 Server 启动后,会各自创建一个 Application 对象并加载所有服务器相关的配置。以便知道自身的信息以及所有其它服务器的信息,在需要的时候用于检索。

参考资料:NetEase/pomelo 初始化

pomelo-init.png

Master Server Startup

在 game-server 目录直接运行 $ pomelo start 后,首先被启动的是 master server ,它是所有其它服务器的管理者。master server 只加载两个组件:CoMaster 和 CoMonitor 。而 CoMaster 运行后,会创建一个 MasterConsoleService 用于处理相关的管理模块(admin modules),并启动一个 MasterAgent 用于与 Admin Client 以及其它子服务器通讯。

所有的管理模块启动后,master server 调用 Starter 逐一启动所有其它子服务器,本地服务器将作为它的子进程被创建,而远程服务器通过 SSH 运行。

参考资料:NetEase/Pomelo Master 服务器启动

pomelo-master.png

Admin Modules: Watchdog

Watchdog 是一个非常重要的管理模块,它被所有的服务器加载。Master server 的 watchdog 维护着一份所有在线服务器的列表。当有新的服务器启动时,会通过 CoMonitor 加载 Watchdog module,然后通过 MonitorAgent 连接并向 MasterAgent 发起订阅请求(subscribe request),以便获得其它服务器启动与断开的事件信息。连接的同时也会触发 MasterWatchDog 广播新服务器上线的事件。这样,所有的服务器便相互知晓各自的存在了。

参考资料:NetEase/Pomelo Watchdog 分析

pomelo-watchdog.png

Connector Server Handler

Connector Server 是一个前端服务器(Frontend Server)主要职责是与客户端通信。当客户端直接请求 Connector Server 提供的 Handler 时,可视为一个最简单的本地服务器调用。CoConnector 收到请求并解码后,将消息路由传递给 CoServer 处理。如果是一个本地路由,则使用 handlerService 直接调用相关函数,最后将处理结果回调、打包、发回客户端。

参考资料:NetEase/Pomelo 与客户端通信

pomelo-connector.png

Remote Process Call

远程服务调用(RPC)可以使不同的服务器之间能够相互使用对方提供的函数,这对服务器集群来说是不可获缺的功能。

客端户只能与 Frontend Server 进行通讯,当客户端向 Connector Server 请求一个后端服务的消息路由时会发生什么?CoServer 会调 doForward 方法,使用 CoProxy 组件将消息通过 RPC 转发给相应的 Server 并通过回调函数将结果发送至客户端。后端服务器则通过 CoRemote 调用系统自带的 msgRemote 接受 RPC 并完成消息转发。这个看似简单的过程同时包含了远程调用与本地调用,是个非常有意义的典型操作。

参考资料:NetEase/Pomelo Rpc调用原理

pomelo-connector-rpc.png


Pomelo 还有非常多有趣的系统值得去探索,日后有时间再慢慢深究。

第一次画时序图,经验不是很足,用的工具还是 Dia ,不过 Dia 用来画 Sequence Diagram 还是有很多可以改进的地方的,所以给作者提交了个 /support-requests/100/