zoukankan      html  css  js  c++  java
  • 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
       });
    });

     

     

  • 相关阅读:
    「Baltic2015」Network
    noip模拟赛 蒜头君的排序
    noip模拟赛 蒜头君的兔子
    codevs2171 棋盘覆盖
    noip模拟赛 蒜头君的坐骑
    noip模拟赛 蒜头君的树
    noip模拟赛 蒜头君打地鼠
    noip模拟赛 密码
    noip模拟赛 轰炸
    noip模拟赛 毁灭
  • 原文地址:https://www.cnblogs.com/fuland/p/4000946.html
Copyright © 2011-2022 走看看