当前位置: 首页 > 编程日记 > 正文

hbase RPCServer源码分析

前置知识: java,nio,多线程

看了几天的源码,写一些自己心得,若有错误请指出。

RPCServer的作用:负责创建listener,reader,responser,handler来处理client端的请求。

RPCServer中重要的子类有:Listener,Reader,Call,Connection,Responser

其中Reader是Listener的子类

listener负责监听client端的请求,主要做nio操作中的accept操作。

while (iter.hasNext()) {key = iter.next();iter.remove();try {if (key.isValid()) {if (key.isAcceptable())doAccept(key);}} catch (IOException ignored) {}key = null;
}

与client创建连接,生成新的channel,并将新的channel注册在reader上。

void doAccept(SelectionKey key) throws IOException, OutOfMemoryError {……SocketChannel channel;……Reader reader = getReader();try {reader.startAdd();SelectionKey readKey = reader.registerChannel(channel);  //listener接受的连接注册在reader上c = getConnection(channel, System.currentTimeMillis());readKey.attach(c);……
}

reader负责处理listener传过来的channel,依次读取数据,

void doRead(SelectionKey key) throws InterruptedException {int count = 0;Connection c = (Connection)key.attachment();……try {count = c.readAndProcess();} catch (InterruptedException ieo) {……
}

这里调用Connection里面的readAndProcess()方法,这个方法的做用是读取客户端的数据,存入一个buffer字节数组中,给processRequest()方法进行处理,

processRequest方法:

protected void processRequest(byte[] buf) throws IOException, InterruptedException {……//这里的call构造方法中的参数都是由buf中的数据解析出来的,前面省略的代码做了这部分工作Call call = new Call(id, this.service, md, header, param, cellScanner, this, responder,totalRequestSize,traceInfo);//这里的scheduler是一个调度器,可以简单理解为一个线程池的控制器,它初始化时会生成默认大小的线程池,参数可由REGION_SERVER_HANDLER_COUNT来指定//也就是jstack文件中的handler线程,默认是30//dispatch方法会获取线程池中的一个线程,执行callRunner中的run()方法。run()方法的功能有:查询结果,并调用sendResponseIfReady()方法来返回数据。scheduler.dispatch(new CallRunner(RpcServer.this, call, userProvider));
}

call的run()方法:

public void run() {……//查询数据,存在resultPair中resultPair = this.rpcServer.call(call.service, call.md, call.param, call.cellScanner,……if (!call.isDelayed() || !call.isReturnValueDelayed()) {Message param = resultPair != null ? resultPair.getFirst() : null;CellScanner cells = resultPair != null ? resultPair.getSecond() : null;call.setResponse(param, cells, errorThrowable, error);}//调用Responser
    call.sendResponseIfReady();……
}

其中rpcServer的call方法为:

public Pair<Message, CellScanner> call(BlockingService service, MethodDescriptor md,Message param, CellScanner cellScanner, long receiveTime, MonitoredRPCHandler status)
throws IOException {……//此句进行查询Message result = service.callBlockingMethod(md, controller, param);……//返回给Call对象return new Pair<Message, CellScanner>(result,controller != null? controller.cellScanner(): null);
……
}

再详细点的还没看。看了这些主要解决了以下几个疑惑:

reader的线程数在哪指定生成,handler的线程池在哪维护,监听连接请求的线程有几个?responser的线程又有几个?

listener只有一个,

listener中有一个Reader数组,默认是10,也就是说读取请求数据的连接池大小为10。

private class Listener extends Thread {
……private Reader[] readers = null;

handler的线程池由RPCServer中的scheduler维护,默认是30,
listener监听到一个请求后,生成对应的channel发送给Reader,然后Reader会为每一个channel创建一个connection,

connection中保存了连接的信息。然后调用connection的方法来读取请求参数,并生成call对象,这时将调用scheduler,

使用handler线程池(默认30)来查询数据,(这里就开始并行了),结果存在call对象用,call对象最后再调用responser类的方法,将结果返回给client。

responser只有一个线程,它维护了一个call链表,采用非阻塞的方式(这里要说也是并行),依次将call对象送出。

大致过程就是这样




转载于:https://www.cnblogs.com/quan-qunar/p/4942972.html

相关文章:

Maya创建科幻3D动画循环场景视频教程

Maya创建科幻3D动画循环场景视频教程 Skillshare – Create a Sci-Fi 3D Animation Loop in Autodesk Maya 持续时间3h 27m 包括项目文件 1280X720 Mkv 语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕机译更准确&#xff09;原英文字幕 大小解压后 3.05G 共20小节课…

2022-2028年中国氢化丁腈橡胶行业市场深度分析及投资规模预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国氢化丁腈橡胶行业市场行业相关概述、中国氢化丁腈橡胶行业市场行业运行环境、分析了中国氢…

js中的json对象和字符串之间的转化

字符串转对象(strJSON代表json字符串) var obj eval(strJSON); var obj strJSON.parseJSON(); var obj JSON.parse(strJSON)&#xff1b; json对象转字符串(obj代表json对象) var str obj.toJSONString(); var str JSON.stringify(obj) 运用时候需要除了eval()以外需要jso…

三种方式实现分布式锁

通过以上过程你可以发现锁的获取是按照创建时间来的,谁先来争取锁谁就先获得锁,因此它实现的是公平锁。答案是不能,以Synchronized关键字为例,Synchronized关键字无论是在偏向锁、轻量级锁还是重量级锁状态都不能实现这点,如重量级锁,重量级锁是靠系统底层的互斥量Mutex实现的,也就是说每个节点(服务器)所使用的互斥量是分开的,节点A的互斥量是无法锁住节点B的线程访问临界区,因此Synchronized关键字只能保证单服务器内的JVM进程的不同线程同步,是不能用做分布式环境中来保证线程同步。

超级挂载 实现过程-代码

公司产品是给机顶盒或者电视做的&#xff0c;玩的就是大型游戏&#xff0c;一个游戏常常能有G级别的数据包&#xff0c;于是产生一个需求&#xff0c;将游戏的数据包存放在外置sdcard上&#xff0c;用户差一个32G的卡能随便玩游戏&#xff0c;不占用设备自身的存储容量&#xf…

synchronized对象锁与类锁用法&如何用synchronized锁字符串对象,这里面的坑要注意

我们使用synchronized通常都有这样一个误区:synchronized锁住的代码块一定是所有线程都互斥的。其实不然!首先我们明确一点,synchronized锁住的是一个对象!如果锁住的这个对象,在多个线程中相同,那么这些线程访问synchronized修饰的代码块时,总是互斥的。但是!如果锁住的这个对象,在多个线程中是不同的,那么这些线程访问synchronized修饰的代码块,是不会互斥的!

浅谈Java分布式与集群

在日常操作中,相信很多人在怎么理解Java分布式与集群问题上存在疑惑,今天就大概说说,不注意听,觉得两个可能是同一个东西,其实这个是两个概念。一句话概括:分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。

550种Blender风格化笔刷素材

550种Blender风格化笔刷素材 550Blender刷风格化版(包括4K阿尔法) 大小解压后&#xff1a;3G 信息: 一个伟大的自定义风格化的刷子使用Blender收集。Alphas包含在其他软件中使用。 ArtStation – [MEGAPACK] 550 Blender Brushes Stylized Edition (4K Alphas Included) Bl…

synchronized用法详解

synchronized 是 Java 中的关键字,是一种同步锁。主要应用于多线程环境下保证线程的安全性。A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

POJ 3723

最大生成树 #include<iostream> #include<cstdio> #include<cstring> #include<set> #include<algorithm> #include<stack> #include<map> #include<queue> #include<list> #include<vector> using namespace std…

有关Run-Time Check Failure #2 - Stack around the variable 'XXX' was corrupted.错误的解决方法

有关Run-Time Check Failure #2 - Stack around the variable ‘XXX’ was corrupted.错误的解决方法 今天我在敲完一段代码运行的时候出现一个错误&#xff0c;如下&#xff1a; Run-Time Check Failure #2 - Stack around the variable ‘filename’ was corrupted. 大概意…

Nginx搭建负载均衡集群

(1).实验环境 youxi1 192.168.5.101 负载均衡器 youxi2 192.168.5.102 主机1 youxi3 192.168.5.103 主机2 (2).Nginx负载均衡策略 nginx的负载均衡用于upstream模板定义的后端服务器列表中选取一台服务器接收用户的请求。一个基本的upstream模块如下&…

如何卸载iPhone模拟器中的自己创建的程序

当你使用iPhone模拟器测试过很多程序以后&#xff0c;模拟器中放置了大量无用的程序。 一直在找如何清除这些程序&#xff0c;其实后来发现很简单。 模拟器本身就带将这些程序清除到垃圾箱的功能。如下图所示&#xff1a;点击上图所示的命令“还原内容和设置...”后出现如下图所…

MySQL存储引擎的介绍

数据库存储引擎是数据库底层软件组件&#xff0c;数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎还可以获得特定的功能。 现在许多数据库管理系统都支持多种不同的…

Maya和Arnold的高级照明实践

Maya和Arnold的高级照明实践 时长6小时20分钟 包括项目文件 1920X1080 MP4 语言&#xff1a;英语机译中文字幕 大小&#xff1a;14.8G 题目&#xff1a;FXPHD - MYA312 - Maya & Arnold的高级照明实践 FXPHD - MYA312 - 玛雅和阿诺德的高级照明实践。 信息&#xff1a;本…

读《大道至简》第六章感想

语言确实是种工具&#xff0c;但我们不应该忽略工具的作用。我们想什么&#xff0c;去做什么事会决定使用什么工具&#xff0c;但反过来我们有什么工具也会决定我们怎么想&#xff0c;怎么做事。如果工具没有提供这个功能&#xff0c;你就不会向这方面想&#xff0c;也就不会这…

Java学习总结:1

Java的特性 1.简洁有效 2.可移植性 3.面向对象 4.解释型 5.适合分布式计算 6.拥有较好的性能 7.健壮、防患于未然 8.具有多线程处理能力 9.具有较高的安全性 10.是一种动态语言 11.是一种中性结构 Java在开发上有三个分支 一.Java EE(Java企业级开发) 二.Java SE(Java标准版…

2022-2028年中国轻型输送带行业市场发展规模及市场分析预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国轻型输送带行业市场行业相关概述、中国轻型输送带行业市场行业运行环境、分析了中国轻型输…

从零开始写个编译器吧 - 单词化简述(Tokenization)

2019独角兽企业重金招聘Python工程师标准>>> 实际上&#xff0c;所谓的源代码&#xff0c;我们可以将其视为一段长长的字符串。所谓字符串&#xff0c;即是字符的有序集。但是&#xff0c;字符本身作为编译器的输入单位&#xff0c;粒度实在太小了&#xff0c;因此&…

springboot+mybatis ,出现多于的参数导致查询数据缺少

在springbootmybatis 中&#xff0c;经常会有多于的字段遗留在xml文件中&#xff0c;这种情况正常人会以为会判断空和null状态&#xff0c;不影响sql语句&#xff0c;但是实际上会有影响&#xff0c; 因为在parameter中未定义&#xff0c;是undefined&#xff0c;而不是null和空…

【C4D教程】Octane渲染大师班

【C4D教程】Octane渲染大师班 本套教程共9大章 4小时20分 高清1920X1080 mp4 视频 英语机译中文字幕 大小 17.8G 信息。 云桥网络 平台获取教程 学习使用Cinema 4D和Octane Render创建惊人渲染的过程和工作流程。 实践分析和指导。 7个项目文件可供学习和借鉴。 C4D Octa…

Java学习总结:2

java的注释 /***文档注释*这种注释的内容会被解释成程序的正式文档*/ public class TestDemo {public static void main(String args[]){System.out.println("Hello MLDN");//System的首字母要大写&#xff0c;否则会显示程序包system不存在/*多行注释............*…

Android采用Application总结一下

什么是 Application   Application和Activity,Service由于是android框架的一个系统组件&#xff0c;当android程序启动时系统会创建一个 application对象。用来存储系统的一些信息。通常我们是不须要指定一个Application的&#xff0c;这时系统会自己主动帮我们创建&#xff…

nginx介绍及常用功能

什么是nginx nginx跟Apache一样&#xff0c;是一个web服务器&#xff08;网站服务器&#xff09;&#xff0c;通过HTTP协议提供各种网络服务。 Apache&#xff1a;重量级的&#xff0c;不支持高并发的服务器。在Apache上运行数以万计的并发访问&#xff0c;会导致服务器消耗大…

网页制作常见的问题(怎样兼容IE6/IE7/火狐浏览器)

1、IE6双边距问题&#xff1f; 在IE6的浏览器中明明设置的是10px的margin却为什么显示的是20px的margin其实这个Ie6的一个双边距BUG 例如: <style type"text/css"> body {margin:0} div { float:left; margin-left:10px; width:300px; height:300px; border:1p…

Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装

Ubuntu系统---安NVIDIA 驱动后 CUDAcuDNN 安装 --------------------------------------------20190726--------------------------------------------------------------------------------------------- 上接《Ubuntu系统---NVIDIA 驱动安装》。预配置环境&#xff1a;Ubunt…

Maya基础入门学习教程

Maya基础入门学习教程 视频&#xff1a;.MKV, 1280x720, 共57节课 时长 4小时25分钟&#xff0c;3GB 语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕机译更准确&#xff09;原英文字幕 指导老师&#xff1a;Shane Whittington Shane Whittington 百度一下 云桥网…

java学习总结:3

逻辑运算 1.’!’(非) 2.与(多个条件一起满足) Java中&&和&都是表示与的逻辑运算符&#xff0c;都表示逻辑运输符and&#xff0c;当两边的表达式都为true的时候&#xff0c;整个运算结果才为true&#xff0c;否则为false。 ’&&的短路功能&#xff0c;当…

asp.net httpmodule 访问页面控件 备忘

用到的时候发现还得找代码&#xff0c;存一个例子方便自己和他人修改&#xff1a; using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls;…

Ubuntu下Sublime Text 3解决无法输入中文的方法

2019独角兽企业重金招聘Python工程师标准>>> 环境&#xff1a; Ubuntu14.04搜狗输入法 for LinuxSublime text 3提示&#xff1a;编译请在非root下进行 本经验目前在Ubuntu14.04环境下&#xff0c;已有搜狗输入法 for Linux和Sublime Text 3的情况下安装成功。 保存…