pomelo rpc原理

以chatpomelo-websocket为例子


proxy收到ADD_SERVERS消息的时候,调用addServers方法,

分两步:

1加载代码生成代理路由

调用 genProxies(this.client, this.app, servers);,调用 client.addProxies(getProxyRecords(app, item));,client是rpcclient,而getProxyRecords会获取sysrpc和userrpc,

sysrpc的方法在remote下面定义,userrpc在每个服务器下面的remote里面定义,如chateserver在remote下面有chatRemote的rpc调用


在rpcclient中,加载sys路由的时候,调用generateProxy(this, record, this._context),生成xxxRemote的实例,然后调用

insertProxy(this.proxies, record.namespace, record.serverType, proxy);,将实例以proxies【namespace】【serverid】的数据形式组织


调用generateProxy(this, record, this._context)生成代理路由的时候很复杂,最终指向rpcclient的proxyCB函数,首先调用配置的route函数,选择一个后端服务器id,然后传入回调函数,调用client.rpcInvoke(serverId, msg, cb);进而在MailStation中分发消息;详细的解释见博客:http://blog.csdn.net/fjslovejhl/article/details/10964613


2:生成mailbox,进行真正的连接
调用this._station.addServers(servers);将servers的信息保存在mailstation中,然而真正的连接创建并非在这里,
而是上一步中,触发远程调用的时候,调到MailStation的分发函数的时候,如果当前Station没有缓存mailbox实例,则会调用lazyConnect创建mailbox实例,创建的时候,会使用存储的servers信息;

备注:一个消息发送的完整过程:
调用dispatch,第一次的时候,会连接lazyConnect,并且调用addToPending把发送的消息放入队列中。连接过程中调用mailbox.connect,在连接成功中删除connecting的连接中的标志,然后调用flushPending,把队列中的消息发出去;发送过程依然是触发dispatch,但此时mailbox实例存在,connecting不存在,所以调用send函数将内容发到其他服务器。


userrpc在服务器间调用使用
调用proxyCB-》调用路由获取后端服务器id,调用client.rpcInvoke(serverId, msg, cb);-》然后调用this._station.dispatch(tracer, serverId, msg, null, cb);分发到其他服务器
sysrpc的使用
以pushMessage为例子,
chatserver调用pushMessage时候,调用sendMessageByGroup,调用  
var namespace = 'sys';
  var service = 'channelRemote';
  var method = 'pushMessage';
的sysrpc函数,后端调用前端,只能调用frontend中的方法,


而从客户端发送聊天消息,则:
sysrpc则在客户端向后端服务器请求时候, 例如chat.chathandler.send,会在connect服务器中,调用server组件的globalHandle函数,因为handle不在本服务器,所以调用 doForward(self.app, msg, session, routeRecord, function(err, resp) ),进而调用app.sysrpc[routeRecord.serverType].msgRemote.forwardMessage,触发了前端服务器对后端服务器的调用,首先将前端session导出一份,作为后端使用。调到proxyCB时候,调用client.rpcInvoke(serverId, msg, cb);发送到chatserver;

在chatserver的forwardMessage中,会根据前端session创建一份后端session,调用server.handle(msg, backendSession, function(err, resp) )将前端服务器分发过来的消息,转发到handler中进行处理,处理完成会将结果回复到前端服务器。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值