分享

对RPC的一点理解,期待大家指正

mexiang 发表于 2013-10-25 10:44:17 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 5159
分析一:
private class Connection extends Thread {
….......
this.setDaemon(true);
}
/** Thread that reads responses and notifies callers.  Each connection owns a socket connected to a remote address.  Calls are multiplexed through this   socket: responses may be delivered out of order. */
这句话我的理解是:1)connection类只是一个daemon线程——即生来就是为别人服务的,为别人服务完自己就死掉了;2)读取应答信息&&通知调用者-在我看来更像是一个客户端的存根(client stub)  解释一下: Client stub is responsible for “marshalling”(编号) arguments and
“unmarshalling” the return values
。图表(图表1)
可以看到是client stub(客户端的存根)真正执行的socket连接。其实那句英文解释也印证了我的推理:
Each connection owns a socket connected to a remote address。-一个conection对应一个socket连接
3):多个calls是复用在这个socket上的。
     总结:可以看到connection终究是一个线程而且是daemon线程,所以他的职责就是连接管理内部线程类,是一个连接线程。
那么如何区分每一个连接,显然不是考connection类来管理的,那是靠什么吗?
分析二:-ConnectionId内部类:
官方解释是:
/**
   * This class holds the address and the user ticket. The client connections
   * (to servers) are uniquely identified by
   */
  private static class ConnectionId {
….......
ConnectionId(InetSocketAddress address, Class protocol,
                 UserGroupInformation ticket) {
      this.protocol = protocol;
      this.address = address;
      this.ticket = ticket;
    }
….....
}
解读:连接服务器的用户连接s是依靠3元组来区别的3者共同决定了连接,如果有一个不同就不是一个连接-同一个用户,连接到同一个实现了同一个协议的远程地址时,连接是一样的。在这个连接上当然是允许许多不同的call的,也就是上面说所的多路复用的socket的意思。(引出分析3)可以看到起构造函数中初始化了这3个参数,因而决定了一个特定的connection连接。
分析三:
说到了一个conneciton上可以有多个call来复用,也就引出了hadoop的RPC机制和java动态代理的:
“可以这样说是现有RPC机制解决,然后用java的动态代理机制解决RPC多个客户端连接一个服务器的”——通过动态代理可以得到调用server的那个call。
分析四:
对于每一个connection线程,可以说是他对应一个socket连接,connections集中在一个 线程池中来管理的。

已有(1)人评论

跳转到指定楼层
xiaolongwu1987 发表于 2013-10-25 10:44:17
看不懂,个人觉得网络上关于RPC的介绍很少,不知道大家有没有好的资料分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条