hadoop 2.6 源码解读之RPC Server 类高性能设计

34 篇文章 0 订阅
23 篇文章 2 订阅

hadoop 2.6 采用 谷歌protocol buffer作为通信协议,但是protocol buffer 相对于Thrift ,需要自己实现一套底层通信框架。

hadoop Server类及其相关类,采用java NIO 及 多reactor 模式事件驱动I/O模型,外加多线程,实现了服务端高并发通信,构建了强有力的分布式基础设施。

今天剖析下其代码实现。

多reactor

java NIO 服务端 reactor 模式实现的关键是 Selector 类对象,Selector 监控需要观察的事件,并返回就绪的 Set < SelectionKey>,然后进行处理。

hadoop 为提高效率,使用了三类reactor :
1、用于监听连接的 selector (一个)
2、用于监听读事件的 readSelector (每个reader 线程一个)
3、用于监听写事件的 writeSelector (一个)

多线程

服务端所用的线程池并非是ExecutorService,而是构造的线程数组
如Reader 线程

for (int i = 0; i < readThreads; i++) {
        Reader reader = new Reader(
            "Socket Reader #" + (i + 1) + " for port " + port);
        readers[i] = reader;
        reader.start();
      }

服务端使用了四组线程

Listener:

单个线程,用于监听连接,持有selector ,然后从 Reader[]线程组内挑选一个线程接受监听好的SelectionKey

Reader[]:

reader 线程组负责读取连接上的读请求,并传递给 Handler线程组,每个线程持有一个readSelector

Handler[]:

hander 线程组负责处理请求并返回响应,未能成功返回的响应交Responder

Responder:

持有一个writeSelector,监听写事件

线程之间的通信

reader hander ,这两个线程组,通过callQueue进行数据交互,callQueue是两个线程类的外部类Server类的成员

//外部类 Server类的成员
CallQueueManager< Call > callQueue
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值