spark2.1源码分析4:spark-network-common模块的设计原理
spark-network-common模块底层使用netty作为通讯框架,可以实现rpc消息、数据块和数据流的传输。
Message类图:
所有request消息都是RequestMessage的子类
所有response消息都是ResponseMessage的子类
TransportClient主要提供了三个方法:
//通过给定的streamId,获取远端数据流
public void stream(final String streamId, final StreamCallback callback);
//发送一份不透明的消息到远端
public long sendRpc(ByteBuffer message, final RpcResponseCallback callback);
//通过给定的streamId,获取远端的数据块
public void fetchChunk(long streamId,final int chunkIndex,final ChunkReceivedCallback callback);
Channel Pipeline:
通过TransportClientFactory的createClient方法追踪ChannelInitializer设置,最后在TransportContext的initializePipeline方法中可以看到具体的Handler的配置:
channel.pipeline()
.addLast("encoder", encoder)
.addLast(TransportFrameDecoder.HANDLER_NAME, NettyUtils.createFrameDecoder())
.addLast("decoder", decoder)
.addLast("idleStateHandler", new IdleStateHandler(0, 0, conf.connectionTimeoutMs() / 1000))
.addLast("handler", channelHandler);
此处得到的handler链为:
MessageEncoder-->TransportFrameDecoder-->MessageDecoder-->IdleStateHandler-->TransportChannelHandler
MessageEncoder:负责将消息转换为netty框架中的ByteBuf
MessageDecoder:负责网络传输的的ByteBuf转换为具体的消息
TransportFrameDecoder:负责接收网络传输的ByteBuf,解析为一个指定大小的ByteBuf交予MessageDecoder,或者交给StreamInterceptor处理
IdleStateHandler:心跳检测
TransportChannelHandler:负责消息的具体处理
发送端发送消息的流程:
- 通过TransportClient的实例发送RequestMessage消息
MessageEncoder把消息转换为ByteBuf
所有RequestMessage的子类都继承了AbstractMessage,而AbstractMessage有一个叫body的filed,该字段在RpcRequest中被用来存储具体的请求内容(不止RpcRequest)。当body为空时该消息直接转换为ByteBuf;不为null时,MessageEncoder将消息转换为MessageWithHeader,MessageWithHeader继承了AbstractReferenceCounted ,实现了FileRegion ,最后消息仍会转换为ByteBuf。注意:MessageWithHeader提供了发送文件的能力。MessageWithHeader类:
class MessageWithHeader extends AbstractReferenceCounted implements FileRegion- ByteBuf被发送到网络(ByteBuf中包含这个消息的总长度、字段长度、具体内容等信息)
接收端接收消息并响应:
- TransportFrameDecoder负责拼接一个RequestMessage所需的完整ByteBuf
- MessageDecoder将消息解析为一个RequestMessage消息
- TransportChannelHandler将消息交给TransportRequestHandler具体处理
- TransportRequestHandler将ResponseMessage消息传递给MessageEncoder
- MessageEncoder把消息转换为ByteBuf(同上)
发送端接收响应消息:
- TransportFrameDecoder负责拼接一个消息所需的完整ByteBuf,如果是StreamResponse消息并且body是一个FileRegion,那么先拼接这个消息的ByteBuf(注意:StreamResponse消息最终传输到网络上时本身不包含FileRegion的ByteBuf)
- MessageDecoder将消息解析为一个ResponseMessage消息
- TransportChannelHandler将消息交给TransportResponseHandler具体处理
- 如果StreamResponse是一个包含FileRegion的消息,TransportResponseHandler在Channel Pipeline中添加一个handler:StreamInterceptor。TransportFrameDecoder将使用StreamInterceptor处理后续的FileRegion的ByteBuf。
spark2.1源码分析4:spark-network-common模块的设计原理的更多相关文章
- Spark源码分析之Spark Shell(下)
继上次的Spark-shell脚本源码分析,还剩下后面半段.由于上次涉及了不少shell的基本内容,因此就把trap和stty放在这篇来讲述. 上篇回顾:Spark源码分析之Spark Shell(上 ...
- Envoy 源码分析--network L4 filter manager
目录 Envoy 源码分析--network L4 filter manager FilterManagerImpl addWriteFilter addReadFilter addFilter in ...
- Envoy 源码分析--network
目录 Envoy 源码分析--network address Instance DNS cidr socket Option Socket ListenSocket ConnectionSocket ...
- spark 源码分析之六--Spark RPC剖析之Dispatcher和Inbox、Outbox剖析
在上篇 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRPCEnv 中,涉及到了Diapatcher 内容,未做过多的剖析.本篇来剖析一下它的工作原理. Dispatc ...
- spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析
spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...
- 一个普通的 Zepto 源码分析(二) - ajax 模块
一个普通的 Zepto 源码分析(二) - ajax 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块,以 ...
- 一个普通的 Zepto 源码分析(三) - event 模块
一个普通的 Zepto 源码分析(三) - event 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块, ...
- jQuery 源码分析(十九) DOM遍历模块详解
jQuery的DOM遍历模块对DOM模型的原生属性parentNode.childNodes.firstChild.lastChild.previousSibling.nextSibling进行了封装 ...
- spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv
在前面源码剖析介绍中,spark 源码分析之二 -- SparkContext 的初始化过程 中的SparkEnv和 spark 源码分析之四 -- TaskScheduler的创建和启动过程 中的C ...
- jQuery 源码分析(二十一) DOM操作模块 删除元素 详解
本节说一下DOM操作模块里的删除元素模块,该模块用于删除DOM里的某个节点,也可以理解为将该节点从DOM树中卸载掉,如果该节点有绑定事件,我们可以选择保留或删除这些事件,删除元素的接口有如下三个: e ...
随机推荐
- 如何才能在python的路上走得更远
刚开始了新的课程,现在又没有什么心情学习了,不知点解就是提不起兴趣去学习,为什么呢?学习python如何才能提起劲,有什么方法可以提上劲学习?
- Flash Alternativa 3D引擎-基础理论
自由行走的花 网站设计,flash网站设计与动画制作,web,as3 2010-12-31 14:29 [转]Flash Alternativa 3D引擎-基础理论 <本文转载自:http:// ...
- 如何让浏览器直接输出HTML代码而不解析
方法一: 将HTML代码嵌入到<script type='text/html' style='display:block'></scipt>中 <script type= ...
- 测试那些事儿—selenium IDE 自动化测试
浏览器 Firefox Setup 35.0.1 安装完成后设置菜单栏 关闭浏览器自动更新 插件配置(必备武器) FireBug Firebug是firefox下的一个扩展,能够调试所有网站语言,如H ...
- 2018.5.11 B树总结
小结 B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于 走右结点: B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键 字范围的子结点: 所有关键字在整颗 ...
- Linux本地yum源配置以及使用yum源安装gcc编译环境
本文档是图文安装本地yum源的教程,以安装gcc编译环境为例. 适用范围:所有的cetos,红帽,fedroa版本 适用人群:有一点linux基础的小白 范例系统版本:CentOS Linux rel ...
- inno安装客户端,写注册表url调用客户端
[Registry] Root: HKCR; SubKey: xxx; ValueData: "xxx"; ValueType: string; Flags: CreateValu ...
- 523. Continuous Subarray Sum
class Solution { public: bool checkSubarraySum(vector<int>& nums, int k) { unordered_map&l ...
- docker WARNING: IPv4 forwarding is disabled. 解决方法
WARNING: IPv4 forwarding is disabled. Networking will not work. 在宿主机添加如下信息 echo net.ipv4.ip_forward= ...
- 使用User Primary Email作为GUID的问题
最近发现有人使用CRM的user primary email作为GUID, 并且做了plugin来控制user primary email. 这样做法是非常有问题而且会影响同名的再次注册的用户. 假如 ...