1. mailbox数据收发模块
一个RPC客户端可能同时需要调用多个远端(server)提供的服务,在pomelo里每个server
抽象为一个mailbox
。先来看看mailbox的实现:
var MailBox = function(server, opts) {
EventEmitter.call(this);
this.curId = 1;
this.id = server.id;
this.host = server.host;
this.port = server.port;
this.protocal = server.protocal || 'http:';
this.requests = {};
this.timeout = {};
this.queue = [];
this.connected = false;
this.closed = false;
this.opts = opts;
this.timeoutValue = 1000;
this.buffMsg = opts.buffMsg;
this.interval= 300;
};
util.inherits(MailBox, EventEmitter);
配置信息比较简单,相比服务端客户端多了一个超时的处理:
var id = this.curId++;
this.requests[id] = cb;
setCbTimeout(this, id, cb);
var pkg = {id: id, msg: msg};
if(this.buffMsg) {
enqueue(this, pkg);
}
else {
this.socket.emit('message', pkg);
}
curId
可以理解为通信过程中的序列号,每次自增,唯一标示一个数据包,通常用来解决数据包的乱序问题。如果buffMsg
被设置则启用缓冲队列,和服务端一致。在发送数据之前会开启一个定时器,如果超时则回调通知上层。
2. mailstation 消息路由
mailstation
主要实现了几个功能:
- 客户端状态控制
- 远程服务端信息管理
- 过滤器
- 消息路由
1. 消息路由
消息路由模块采用延迟加载的方式,加给mailstation添加远程服务端配置信息的时候没有马上加载一个mailbox
与之对应,而是在真正对该服务器请求服务的时候创建对应的实例: