Pomelo的Router

  在pomelo中,对服务器的扩充非常简单,只需要修改一下配置文件config/servers.json,多添几台服务器配置就行了,如果我们的connector和chat都具有多台服务器,因此需要考虑对用户请求的服务器分配问题

1.对于gate服务器来说,由于有多个connector,所以需要从中选择一个服务器的信息进行返回,这里我们增加了一个工具函数dispatch,它完成具体的分配运算,他使用用户的uid的crc32的校验码与connector服务器的个数取余,从而得到一个connector服务器,大致代码如下:

module.exports.dispatch = function(key, list) {
  var index = Math.abs(crc.crc32(key)) % list.length;
  return list[index];
};

 

2.对应chat服务器,需要选择由哪台chat服务器来服务,也就是前端服务器把这个客户端请求路由到哪个后端服务器上。配置路由使用application的route调用,这里我们也使用了前面提到的工具函数dispatch,使用同样的服务器分配策略,示例如下:

var chatRoute = function(session, msg, app, cb) {
  var chatServers = app.getServersByType('chat');

  if(!chatServers || chatServers.length === 0) {
    cb(new Error('can not find chat servers.'));
   return;
  }

  var res = dispatcher.dispatch(session.get('rid'), chatServers);

  cb(null, res.id);
};

app.configure('production|development', function() {
  app.route('chat', chatRoute);
});

  其中chatRoute就是路由函数,他接受四个参数,返回一个其选择的后端服务器id,四个参数中,第一个是专门用作路由计算的参数,前端服务器路由请求给后端服务器发rpc调用时,会使用session作为计算路由的参数,但是当用户自定定义rpc的时候,用户完全可以自己定义这个参数的含义,当然也可以使用session。第二个参数msg描述了当前rpc调用的所有信息,包括调用的服务器类型,服务器名字,具体的调用方法等信息。第三个参数是一个上下文变量,一般情况下会由app来充当,第四个是一个获得到后端服务器id后的回调函数。

  pomelo如果采用hybridconnector的方式,路由信息还可以压缩,即在客户端与服务器建立连接的握手过程中,服务器会将整个字典传给客户端,这样在以后的通信中,对于路由信息,将全部使用定义的小整数进行标记,大大地减少了额外信息开销,目前pomelo提供了基于字典的路由信息压缩。

  • 对于服务端,pomelo会扫描所有的Handler信息
  • 对于客户端,用户需要在config/dictionary.json中声明所有客户端使用的路由。

比如,在config/dictionary.json里
[
  'onChat',
  'onAdd',
  'onLeave'
]

然后在app.js中配置

app.configure('production|development','connector', function() {
  app.set('connectorConfig', {
    connector: pomelo.connectors.hybridconnector,
    heartbeat: 3,
    useDict: true // enable dict
   });
});

app.configure('production|development','gate', function() {
  app.set('connectorConfig', {
    connector: pomelo.connectors.hybridconnector,
    useDict: true // enable dict
   });
});

 

 

posted @ 2014-09-29 20:27  腐烂的翅膀  阅读(2125)  评论(0编辑  收藏  举报