【公司要求】- 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)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. ...
随机推荐
- 不同平台下Java环境变量的设置
http://www.java.com/en/download/help/path.xml
- WWDC2014 debugging_in_xcode_6 总结
1.GCD的waiting queue 可以在Xcode左侧的面板中查看. 2.可以对View进行debug类似reveal. 3.查看运行时的对象,对于自定义对象可以实现- (id)debugQui ...
- HDU 5638 拓扑排序+优先队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...
- 使用HTML5中postMessage实现Ajax中的POST跨域问题
HTML5中提供了在网页文档之间相互接收与发送信息的功能.使用这个功能,只要获取到网页所在窗口对象的实例,不仅仅同源(域+端口号)的web网页之间可以互相通信,甚至可以实现跨域通信. 浏览器支持程度: ...
- CSS3中box-shadow的用法介绍
一般我们通过box-shadow来设置盒阴影,但是有些属性我们一般没有用到,这篇文章将对box-shadow属性进行逐个分析.语法 CSS Code复制内容到剪贴板 E {box-shadow:ins ...
- 使用Npoi向Excel中插入图片
先把数据库中的数据都导入到Excel表格中,把图片地址的路径全部转成绝对路径. 使用Npoi读取刚导出的Excle表格,把图片那个单元格的图片路径读出来,然后用文件流读取图片,然后通过Npoi把图片放 ...
- bzoj 1028 暴力枚举判断
昨天梦到这道题了,所以一定要A掉(其实梦到了3道,有两道记不清了) 暴力枚举等的是哪张牌,将是哪张牌,然后贪心的判断就行了. 对于一个状态判断是否为胡牌,1-n扫一遍,然后对于每个牌,先mod 3, ...
- hdu 3572 Task Schedule 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 Our geometry princess XMM has stoped her study i ...
- 0910 noip模拟
教师节快乐: T1:勇士闯魔塔,是一道很裸的莫队题目,但在老师的催促下,出题人@syq同学修改了第一题,使之成了一道送分题,全暴力水过: T2:第二题是一道预处理+分组背包,考试中,忘了分组背包怎么敲 ...
- GS玩家登录
玩家上线 这个过程看了很多很多次了,这里在看下 客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中 .客户端发送c2s_log ...