NetEase / pomelo-cn

The Chinese issues for pomelo.
38 stars 13 forks source link

request "chat.chatHandler.send" timeou #214

Open lg-john opened 10 years ago

lg-john commented 10 years ago

1. servers.json image

  1. 在gate 中设置了connector 和chat 的关系

Handler.prototype.queryEntry = function(msg, session, next) { var name = msg.name; var pwd = msg.pwd; if(!name || !pwd){ next(null,{code:Code.FAIL}); return; }

var self = this;
userDao.getUserByName(name,function(err,user){
    if(err){
        next(null,{code:Code.FAIL});
        return;
    }

    var uid = user.id;
    if(!uid) {
        next(null, {code: Code.FAIL});
        return;
    }

    var connectors = self.app.getServersByType('connector');
    if(!connectors || connectors.length === 0) {
        next(null, {code: Code.GATE.NO_SERVER_AVAILABLE});
        return;
    }

    var tk = Token.create(uid, Date.now(), secret);
    var res = dispatcher.dispatch(uid, connectors);
    next(null, {code: Code.OK, host: res.host, port: res.clientPort,token:tk,uid:user.id});
});

};

  1. 开始进入 connector.entryHandler.entry ,代码如下

pro.entry = function(msg, session, next) { var token = msg.token; var self = this;

if(!token) {
    next(new Error('invalid entry request: empty token'), {code: Code.FAIL});
    return;
}

var uid, players, player;
async.waterfall([
    function(cb) {
        // auth token
        self.app.rpc.auth.authRemote.auth(session, token, cb);
    }, function(code, user, cb) {
        // query player info by user id
        if(code !== Code.OK) {
            next(null, {code: code});
            return;
        }

        if(!user) {
            next(null, {code: Code.ENTRY.FA_USER_NOT_EXIST});
            return;
        }

        uid = user.id;
        userDao.getPlayersByUid(user.id, cb);
    }, function(res, cb) {
        // generate session and register chat status
        players = res;
        self.app.get('sessionService').kick(uid, cb);
    }, function(cb) {
        session.bind(uid, cb);
        session.set('rid', uid);//session.settings[rid] = rid;
        session.push('rid', function(err) {
            if(err) {
               console.error('set rid for session service failed! error is : %j', err.stack);
            }
       });
    }, function(cb) {
        if(!players || players.length === 0) {
            next(null, {code: Code.OK});
            return;
        }

        player = players[0];

        session.set('serverId', self.app.get('areaIdMap')[player.areaId]);
        session.set('playername', player.name);
        session.set('playerId', player.id);
        session.on('closed', onUserLeave.bind(null, self.app));
        session.pushAll(cb);
    }, function(cb) {
        self.app.rpc.chat.chatRemote.add(session, uid, player.name,channelUtil.getGlobalChannelName(), cb);
        next(null,{code:Code.OK,player:player});
    }
], function(err) {
    if(err) {
        next(err, {code: Code.FAIL});
        return;
    }

    next(null, {code: Code.OK, player: players ? players[0] : null});
});

};

4 在app.js 设置了

app.route('chat',routeUtil.chat);

routeUtil.chat 的代码如下: exp.chat = 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);

};

  1. 在客户端(flash 端)访问 chat.chatHandler,send 。 就跑异常 [2013-10-17 14:47:39.682] [INFO] [default] - [2013-10-17 14:47:39.675] [WARN] \node_modules\pomelo\lib\filters\handler\timeout.js - request "chat.chatHandler.send" timeout.

我跟踪发现, gateHandler 分配的是connector-server-1, 在routeUtil.chat 中拿到的是chat-server-1 , 是不是这样导致了问题,希望知道的朋友给个解释,先感谢了!

py8765 commented 10 years ago

不是这个原因,request请求到达handler超时导致,你应该是在app.js里面设置了timeout 这个filter,检查一下服务器是不是正常启动。

peterchen08 commented 10 years ago

你的代码逻辑判断有问题: Handler.prototype.queryEntry = function(msg, session, next) { var name = msg.name; var pwd = msg.pwd; if(!name || !pwd){ next(null,{code:Code.FAIL}); return; }

只有当next被调用的时候,客户端才能接收到信息,看看你的代码,只当用户名或密码为空的时候发送消息 if(!name || !pwd){ next(null,{code:Code.FAIL}); return; }

那么不为空的时候呢?应该这么写: if(!name || !pwd){ next(null,{code:Code.FAIL}); return; } next(null,{code:Code.OK}); 意思是为空的时候发送FAIL,不为空的时候发送OK