请教各位达人关于RPC的一个小问题

在connector'代码里面,调用
self.app.rpc调用某个逻辑方法时,会选择哪个服务器进行调用呢?

或者说,一个connector,就对应一个后台服务器?

举例:
在servers.json里配置了三个chat服务器,
实现一个聊天服务器,通过gate获得了connector后,链接connector,然后调用self.app.rpc.chat.chatRemote.add(),这里面会路由到哪个chat?

标签: pomelo 开发求助
15579189729 在 2016-4-15 00:37发布 分享到 weibo
4 回复
#1 linyouhappy 2016-4-15 07:03 回复

这个靠自己设置的。所有的路由都可以自己设置的。比如rpc调用为什么第一个参数放session呢?其实这个session只是做路由选择用的。也可以不传,它就默认第一个。可以运行调试,进入到路由模块的。你就知道大概路由的原理了。

#2 15579189729 2016-4-15 08:51 回复

不明觉厉~~~
领导,能有进一步指点吗?
刚接触pomelo,之前玩bigworld的。

#3 linyouhappy 2016-4-15 16:09 回复

rpc路由,有两种。一种是指定serverId,另一种是指定serverType。

具体代码看game-server/node_modules/pomelo/lib/components/proxy.js

serverId的路由
pro.rpcInvoke = function(serverId, msg, cb) {
this.client.rpcInvoke(serverId, msg, cb);
}
就是这个函数调用了。
因为servers表格配置所有的服务器的ip和端口,所以,通过serverId完全可以路由到指定的服务器了。

serverType的路由,这个可以自己定义了。
具体哪一个服务器。看这个函数。
var defaultRoute = function(session, msg, app, cb) {
var list = app.getServersByType(msg.serverType);
if (!list || !list.length) {
cb(new Error('can not find server info for type:' + msg.serverType));
return;
}

var uid = session ? (session.uid || '') : '';
var index = Math.abs(crc.crc32(uid.toString())) % list.length;
utils.invokeCallback(cb, null, list[index].id);
};

你看完这个函数,就明白为什么那样用了。
pro.afterStart = function(cb) {
var self = this;
this.app.defineGetter('rpc', function() {
return self.client.proxies.user;
});
this.app.defineGetter('sysrpc', function() {
return self.client.proxies.sys;
});
this.app.set('rpcInvoke', this.client.rpcInvoke.bind(this.client), true);
this.client.start(cb);
};

以上都在同一个文件。

#4 {1} linyouhappy 2016-4-15 16:17 回复

servers.json里配置了三个chat服务器,那么,如果是serverType(即chat)rpc调用,那么要确保每个session对应的chat服务器是唯一的。具体怎样对应,看自己的需求。
var uid = session ? (session.uid || '') : '';
var index = Math.abs(crc.crc32(uid.toString())) % list.length;
上面的计算结果是唯一的。
所以,rpc调用之间不会乱。不会connector 一会传这个chat,一会传另一个chat.

明白上述原理,就明白
调用self.app.rpc.chat.chatRemote.add(),这里面会路由到哪个chat?。
这个问题了。

Jeson 2017-10-13 16:01 回复

多谢大佬的指点,终于明白rpc调用的第一个参数的意义了。
session的作用是 提供session.uid经过crc计算,得到服务器的索引。

回到顶部