比如有多个聊天服务器,我们需要把消息路由的不同的服务器下处理
/*
msg结构:
{
namespace: 'sys',
serverType: 'gate',
service: 'msgRemote',
method: 'forwardMessage',
args: [
{
id: 1,
type: 0,
compressRoute: 0,
route: 'gate.gateHandler.getServer',
body: [Object],
compressGzip: 0
},
{
id: 1,
frontendId: 'connector-server-1',
uid: null,
settings: {}
}
]
}
*/
function myRoute(session, msg, app, cb) {
var chatServers = app.getServersByType('chat');
if (!chatServers) {
cb(new Error('can not find chat servers.'));
return;
}
cb(null, chatServers[0].id);//把所有的发往chat服务器的消息都发往第一台chat服务器中
};
app.configure('production|development', function(){
app.route('chat', myRoute);//给chat服务器注册路由
});
用来向用法推送消息的服务
remote.add = function(uid, sid, cb){
var channel = channelService.getChannel('pomelo', true); //得到channel,true在没有的时候创建。
if(!!channel)
channel.add(uid, sid);//uid客户id,sid前端服务器id
};
handler.kick = function(uid, sid, name){
var channel = channelService.getChannel(name, false);
if (!!channel) {
channel.leave(uid,sid);
}
};
app.rpc.chat.chatRemote.add(session, uid, app.get('serverId'), function(data){});
var channel = channelService.getChannel('pomelo', false);
channel.pushMessage({route:'onChat', msg:'hello'});
pomelo.on('onChat', function(data) {});
FrontendSession:
前端服务器处理函数中的session,原生session的前端代理。session{
id //session的id,全局唯一
uid //可以绑定一个uid
frontendId //维护这个session的服务器id
settings //key-value表
bind(uid, cb) //把uid绑定到session上
unbind(uid, cb)
set(key, value)//设置值
get(key)//取值
push(key, cb)//cb(err)把设置的值同步到原生session中
pushAll(cb)
on(eventName, cb)
}
BackendSession:
后端服务器处理函数中的session,原生session的后端代理。session{
id //session的id,全局唯一
uid //可以绑定一个uid
frontendId //维护这个session的服务器id
settings //key-value表
bind(uid, cb) //把uid绑定到session上
unbind(uid, cb)
set(key, value)//设置值
get(key)//取值
push(key, cb)//cb(err)把设置的值同步到原生session中
pushAll(cb)
on(eventName, cb)
}
channel{
add(uid, sid)//uid用户id,sid前端服务器id
leave(uid, sid)//
}