POMELO 采用多进程的架构可以很好的实现游戏服务器(进程)的扩展性,达到支撑较多在线用户、降低服务器压力等要求。进程间通信采用RPC的形式来完成,pomelo的RPC实现的相当精巧。采用类似如下的方式就可以调用remote服务器提供的服务:
proxies.user.test.service.echo(routeParam, 'hello', function(err, resp) {
if(err) {
console.error(err.stack);
return;
}
console.log(resp);
});
上面的一段RPC调用可以理解为:
调用namespace类型为user、服务器类型为test的service模块的echo接口
现在听着有些拗口,没关系,且听我慢慢来分析:)
服务端源码分析
pomelo-rpc的源码我阅读+debug了不下30次,下面我将依照从底层数据交换模块到上层业务逻辑分发处理的方式依次介绍服务端与客户端的源码架构。
1. 基于socket.io模块的数据通信模块
一般来说我们在写socket数据通信模块有几个问题是必须要去解决的,譬如说:
- 粘包的问题
- 丢包以及乱序的问题
- ip地址过滤
- 缓冲队列的实现
- 与上层模块的交互模式
这里把pomelo-rpc实现过的来说一说。nodejs 内置一个events模块。这也导致了把一个模块封装成一个事件收发器是相当自然的一件事情:
var Acceptor = function(opts, cb) {
EventEmitter.call(this);
this.bufferMsg = opts.bufferMsg;
this.interval = opts.interval || 300;
this.whitelist= opts.whitelist;
this._interval = null;
this.sockets = {};
this.msgQueues = {};
this.server = null;
this.notify = cb;
};
util.inherits(Acceptor, EventEmitter);
利用node内置