【公司要求】- RPC学习(一)
HADOOP-IPC(这里说的是1.0.4版本) 是轻量级RPC,在hadoop中主要用于2方面
1、TaskTracker和JobTracker 通讯。
2、NameNode和DataNode通讯。
3、DataNode和DataNode通讯。
作者的意图是尽量暴露细节参数给用户从而达到增加灵活性(比如连接超时设置、并发业务处理器数量、队列长度设置等)。核心代码3000行左右。采用基于java-NIO非阻塞方式,设计中间有一些细节是很值得学习的。下图展示了IPC总体设计方式(其实是网路服务器架构方式,缺少业务处理模handler)
一些细节:
1、hadoop更新版本迅速,所以IPC在内部通讯的时候都实现了VersionProtocal接口,不同的版本的Server和Client是不能通讯的。
2、新的版本(2.0.0)中加入了PRCEngine用于扩展第三方RPC框架的接入,增大灵活性。
3、Client由于是异步调用所以无法保证消息顺序,因此Client把ConnectionId类作为Key放到了本地缓存中。返回一个remove一个。
4、Client做了链接复用。而且用户可以回收连接时间间隔(当连接空闲的时候)。
5、Server端Responder是一个独立的线程服务,作用是防止RPC调用时间过长而阻塞服务处理器(Handler是共享资源,要提高并发就要尽量减少公共资源的使用时间)。因此如果Server中只有一个请求业务时(表明服务端压力不大),Handler直接打包返回。如果大于1,则Handler的持有线程(业务线程)。把请求转交给Responder线程处理,同事Register通道的OP_WRITE写事件。后续和Client交互又Responder处理。
6、Listener和Reader分离,每部分都利用了NIO的Reactor模式。Listener处理网络监听连接事件,Reader由Listener启动负责打包成Server可以接受的对象放到业务处理器要处理的队列中。
使用DEMO:
我们在使用Hadoop——IPC做我们自己的分布式系统的基础框架也是比较方便的,需要引用Hadoop-core-x.x.x.jar,其实还是建议抽取出来加以改进更好的支持业务。最后下面引用某教材。
0、边界业务接口和实现
 public interface IPCQueryStatus extends VersionedProtocol {
     IPCFileStatus getFileStatus(String filename);
 }

 public class IPCQueryStatusImpl implements IPCQueryStatus {
     protected IPCQueryStatusImpl() {
     }
     @Override
     public IPCFileStatus getFileStatus(String filename) {
         IPCFileStatus status=new IPCFileStatus(filename);
         System.out.println("Method getFileStatus Called, return: "+status);
         return status;
     }
     @Override
     public long getProtocolVersion(String protocol, long clientVersion) throws IOException {
         System.out.println("protocol: "+protocol);
         System.out.println("clientVersion: "+clientVersion);
         return IPCQueryServer.IPC_VER;
     }
 }


 public class IPCFileStatus implements Writable {
     private String filename;
     private long time;
     static {   // register IPCFileStatus
         WritableFactories.setFactory
             ( IPCFileStatus.class,
               new WritableFactory() {
                   public Writable newInstance() { return new IPCFileStatus(); } } );
     }
     public IPCFileStatus() {
     }
     public IPCFileStatus(String filename) {
         this.filename=filename;
         this.time=(new Date()).getTime();
     }
     public String getFilename() {
         return filename;
     }
 }

1、开启server
IPCQueryStatusImpl queryService=new IPCQueryStatusImpl();
Server server = RPC.getServer(queryService, "0.0.0.0", IPC_PORT, 1, true,new Configuration());
server.start();
2、开启client
InetSocketAddress addr=new InetSocketAddress("localhost", IPCQueryServer.IPC_PORT);
IPCQueryStatus query=(IPCQueryStatus) RPC.getProxy(IPCQueryStatus.class, IPCQueryServer.IPC_VER, addr,  new Configuration());
IPCFileStatus status=query.getFileStatus("/tmp/testIPC");
下期写Hadoop的具体实现细节和基础知识回顾。
【公司要求】- RPC学习(一)的更多相关文章
- RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互
		
本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...
 - RPC学习
		
之前有一篇文章,说了RPC的内容: http://www.cnblogs.com/charlesblc/p/6214391.html 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对 ...
 - 公司C++规范学习
		
目录 公司C++规范学习 语法部分 风格/约定 公司C++规范学习 语法部分 class和struct关键字的选择:class表示被封装的用户自定义类型,不公开定义非静态数据成员,struct表示数据 ...
 - [RPC学习]Dubbo+nacos实现动态更新内存RTree
		
1.背景 服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HT ...
 - RPC学习----Thrift快速入门和Java简单示例
		
一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...
 - 公司需求知识学习-WCF
		
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
 - Hyberledger-Fabric 1.00 RPC学习(2)尝试建立一个network
		
本文参考:http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html 这里我们学习建立第一个Hyperledger Fa ...
 - Hyberledger-Fabric 1.00 RPC学习(1)
		
参考:http://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.html 本文的目的就是基于Hyperledger Fabr ...
 - RPC 学习(一)认识
		
文章部分描述来自参考资料 RPC 什么是RPC RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. ...
 
随机推荐
- HTML统一资源定位器
			
w3c 更好的解释 在OSGi in action中安装bundle时要加文本传输协议,要不然shell判断不出来
 - timersmanager 解析
			
最近在看crtmp源代码,看到timersmanager 模块时感觉很难理解,花了不少时间反复思考该模块 的逻辑,现在思考的结果记录下来,方便以后查阅. 构造函数中将处理时间方法传进来,将_lastT ...
 - sourceInsight使用技巧,持续更新中~~~
			
作为测试人员,读各种平台的工程代码时,根本不想安装各种vs或者eclipse等,于是,就找了一款代码阅读工具. sourceInsight,下载地址为官网:http://www.sourceinsig ...
 - python--参数列表的分拆
			
当你要传递的参数已经是一个列表,调用的函数却接受分开一个个的参数,这个时候可以考虑参数列表拆分: 可以使用* 操作符来自动把参数列表拆开: args=[3,6] x=list(range(*args) ...
 - Spring项目跟Axis2结合
			
本文的前提是已经有一个Spring的项目,在此基础上如何跟Axis2进行结合,开发出WebService服务和调用WebService服务. 1.开放WebService服务 1.引入必要的ja ...
 - mongo二维数组操作
			
有2个嵌套的数组: 如果我想查询comments里score大于5的记录: testProvider.find({"comments.score":{"$gt" ...
 - 新浪SAE中文分词接口
			
最近发现新浪SAE平台上竟然也提供分词功能,分词效果也还不错,由新浪爱问提供的分词服务,研究了一番,做了一个简易版的在线调用接口(get方式,非post) 官网说明:http://apidoc.sin ...
 - 如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?
			
[编者按]本篇文章作者是Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客.本篇文章中,作者主要介绍了如何基于Parse特点,打造一款类似Instagram的应 ...
 - ZOJ2929 Penalty Kick(概率)
			
题目挺水的,但由于其独特的阅读量比赛的时候没发现这道水题,在此做一下翻译,如果有人搜到这翻译的话有帮助的话自然最好啦. 中国队平局进入最后的点球决胜局,首先抛硬币决定谁先罚球,然后先是罚五球,如果罚的 ...
 - 【C语言】二维数组做形参
			
二维数组有两种形式: ①在栈上: int a[4][4] = {...}; ②在堆堆上: int ** a = new int *[4]; for ...