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学习(一)的更多相关文章

  1. RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

    本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...

  2. RPC学习

    之前有一篇文章,说了RPC的内容: http://www.cnblogs.com/charlesblc/p/6214391.html 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对 ...

  3. 公司C++规范学习

    目录 公司C++规范学习 语法部分 风格/约定 公司C++规范学习 语法部分 class和struct关键字的选择:class表示被封装的用户自定义类型,不公开定义非静态数据成员,struct表示数据 ...

  4. [RPC学习]Dubbo+nacos实现动态更新内存RTree

    1.背景 服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HT ...

  5. RPC学习----Thrift快速入门和Java简单示例

    一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...

  6. 公司需求知识学习-WCF

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  7. Hyberledger-Fabric 1.00 RPC学习(2)尝试建立一个network

    本文参考:http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html 这里我们学习建立第一个Hyperledger Fa ...

  8. Hyberledger-Fabric 1.00 RPC学习(1)

    参考:http://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.html 本文的目的就是基于Hyperledger Fabr ...

  9. RPC 学习(一)认识

    文章部分描述来自参考资料 RPC 什么是RPC     RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. ...

随机推荐

  1. Bootstrap入门五:表格

    table样式: .table:表格基本样式,很少的padding,灰色的细水平分隔线. .table-striped:斑马纹样式,隔行换色. .table-bordered:为表格和其中的每个单元格 ...

  2. 三门概率问题之C#版

    前言: 早上看到一片关于三门问题的博客http://www.cnblogs.com/twocats/p/3440398.html,抱着该博客结论的怀疑态度用C#语言写了一些代码.实验证明该博客的结论是 ...

  3. MyEclipse2015 编写js报 'Calculating completion proposals..' has encountered a problem.

    前言:编写js(按点后)弹出这个鬼东西,百度不到..估计是破解有问题.只有换版本了. 版本:MyEclipse 2015 stable 1.0 详细错误信息 解决:换成2.0版本

  4. 设计模式之享元模式(FlyWeight)

    #include <iostream> #include <string> #include <list> #include <vector> usin ...

  5. Vim 常用命令 一

    今天第一次学习了 Vim编辑器的一些使用  拿出来和大家分享下. 1.首先 列出 常用快捷键 u 表示 撤销上一步 x 表示 删除光标位内容 dd 表示 删除光标所在行内容 >G   表示 光标 ...

  6. [工作积累] android 中添加libssl和libcurl

    1. libssl https://github.com/guardianproject/openssl-android 然后执行ndk-build 2.libcurl 源代码组织结构, 下面的mak ...

  7. google大赛 入围赛250分真题

    Problem StatementYou have a collection of music files with names formatted as "genre-artist-alb ...

  8. java正则表达式解析短信模板

    /** * */ package testJava.java; import java.util.HashMap; import java.util.Map; import java.util.Sca ...

  9. spring mvc Controller与jquery Form表单提交代码demo

    1.JSP表单 <% String basePath = request.getScheme() + "://" + request.getServerName() +&qu ...

  10. Sqli-labs less 17

    Less-17 本关我们可以看到是一个修改密码的过程,利用的是update语句,与在用select时是一样的,我们仅需要将原先的闭合,构造自己的payload. 尝试报错 Username:admin ...