Pomelo杂记(二)
1、访问后端服务器handler
-------------------------------------
客户端也可以直接调用后端服务器的handler,但是内部实际上是先连接到前端服务器,在components/server.js中执行
app.sysrpc[routeRecord.serverType].msgRemote.forwardMessage
通过rpc调用后端服务器的forwardMessage方法(/game-server/node_modules/pomelo/lib/common/remote/backend/msgRemote.js),在forwardMessage方法中重新调用后端服务器的
server.handle方法以调用客户端的目标方法.
frontend服务器forward消息的地方在:
https://github.com/NetEase/pomelo/blob/master/lib/server/server.js#L178
backend服务器接收消息的地方在:
https://github.com/NetEase/pomelo/blob/master/lib/common/remote/backend/msgRemote.js#L20
-------------------------------------
2、rpc调用
-------------------------------------
pomelo 是一个多进程相互协作的环境,rpc服务,让frontend 能够调用backend 的方法
self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){
next(null, {
users:users
});
});
rpc调用传递的第一个参数session,主要用于计算出路由,以确定请求要发到哪台服务器,也就是说第一个参数只用来route,所以不一定需要传递session对象(可以是其他值),
路由设置app.route('chat', routeUtil.chat);参见routeUtil,此参数在remote里面是没有接收的。
-------------------------------------
3、广播channel
-------------------------------------
Channel是服务器端向客户端推送消息的通道。Channel可以看成一个玩家id的容器,通过channel接口,可以把玩家id加入到channel中成为当中的一个成员。之后向channel推送消
息,则该channel中所有的成员都会收到消息。Channel只适用于服务器进程本地,即在服务器进程A创建的channel和在服务器进程B创建的channel是两个不同的channel,相互不影
响。
chanelService保存自定义的频道名,每个频道里保存前端服务器的ID:sid和每个用户的ID:uid在groups,groups[sid]取得所有通过同一个前端服务器登陆的uid。
0.5版本后加入了globalChannel,它提供全局的channel服务,其默认实现是通过redis将相关信息存储,开发者可以根据自身需求开发其它实现;Pomelo原有的channelService只能在具体某个服务器中创建channel,这种channel只能存储该服务器的用户信息,而globalChannelService则可以创建全局的globalChannel,所有服务器的用户信息都可以通过globalChannel进行存储。
-------------------------------------
4、通信加密
-------------------------------------
目前,pomelo通讯数据时没有进行加密的,通信数据需自行加密,当然如果使用protobuf也等于加密了数据
-------------------------------------
5、async控制流
-------------------------------------
异步的机制决定,pomelo里面要涉及到工作流控制,一般使用async控制流,常见方法如下
1.parallel方法是并行执行一组异步函数,这些函数之间没有顺序上的差异,如果其中一个返回err,则最终的callback返回err 和每个函数返回值组成的数组。
2.series方法是顺序执行一组异步函数,每个函数必须在上个函数执行完才开始执行,如果其中一个返回err,则之后的函数不在执行,并且最终的callback会立刻并返回err.
3.waterfall方法和series一样都是顺序执行一组异步函数,不同的是每个函数执行完毕须把结果传递给下个函数,下个函数可能对上个函数的结果有依赖。
-------------------------------------