几张 Pomelo 框架的序列图
最近一年来,强连接的手机网游慢慢多起来了,这也促使我开始对它们使用的技术好奇起来。这个月研究了一些有关游戏服务端的东西。读了一些相关的书籍,例如《大型多人在线游戏开发》。这才发觉目前工作中使用的技术与之相差甚远。现在在开发的项目简单说就是带网络储存功能的单机游戏罢了,想直接加入玩家之间流畅的实时对战的功能几乎不可能。所以乎我决定深入学习一下 MMORPG 相关的技术以及框架。
网易开源的 Pomelo 游戏服务端框架提供了一个不错的学习环境,而且是使用我最熟悉的 javascript 编写而成。于是我打算将它作为一个目标好好研究一下,看看它是如何被组织、运作的。
Pomelo 的官方 Wiki 提供了许多不错的文档,对框架的描述也还算到位。不过文档中展示的所有时序图使用了非标准的过程调用画法,箭头十分混乱,导致阅读起来非常困难。所以我打算自己通读一遍源码后整理几张重要的时序图,以便之后翻阅。
¶Pomelo Initial
Pomelo 的每个 Server 启动后,会各自创建一个 Application 对象并加载所有服务器相关的配置。以便知道自身的信息以及所有其它服务器的信息,在需要的时候用于检索。
参考资料:NetEase/pomelo 初始化
¶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 服务器启动
¶Admin Modules: Watchdog
Watchdog 是一个非常重要的管理模块,它被所有的服务器加载。Master server 的 watchdog 维护着一份所有在线服务器的列表。当有新的服务器启动时,会通过 CoMonitor 加载 Watchdog module,然后通过 MonitorAgent 连接并向 MasterAgent 发起订阅请求(subscribe request),以便获得其它服务器启动与断开的事件信息。连接的同时也会触发 MasterWatchDog 广播新服务器上线的事件。这样,所有的服务器便相互知晓各自的存在了。
参考资料:NetEase/Pomelo Watchdog 分析
¶Connector Server Handler
Connector Server 是一个前端服务器(Frontend Server)主要职责是与客户端通信。当客户端直接请求 Connector Server 提供的 Handler 时,可视为一个最简单的本地服务器调用。CoConnector 收到请求并解码后,将消息路由传递给 CoServer 处理。如果是一个本地路由,则使用 handlerService 直接调用相关函数,最后将处理结果回调、打包、发回客户端。
¶Remote Process Call
远程服务调用(RPC)可以使不同的服务器之间能够相互使用对方提供的函数,这对服务器集群来说是不可获缺的功能。
客端户只能与 Frontend Server 进行通讯,当客户端向 Connector Server 请求一个后端服务的消息路由时会发生什么?CoServer 会调 doForward 方法,使用 CoProxy 组件将消息通过 RPC 转发给相应的 Server 并通过回调函数将结果发送至客户端。后端服务器则通过 CoRemote 调用系统自带的 msgRemote 接受 RPC 并完成消息转发。这个看似简单的过程同时包含了远程调用与本地调用,是个非常有意义的典型操作。
Pomelo 还有非常多有趣的系统值得去探索,日后有时间再慢慢深究。
第一次画时序图,经验不是很足,用的工具还是 Dia ,不过 Dia 用来画 Sequence Diagram 还是有很多可以改进的地方的,所以给作者提交了个 /support-requests/100/