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:负责消息的具体处理

发送端发送消息的流程:

  1. 通过TransportClient的实例发送RequestMessage消息
  2. 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

  3. ByteBuf被发送到网络(ByteBuf中包含这个消息的总长度、字段长度、具体内容等信息)

接收端接收消息并响应:

  1. TransportFrameDecoder负责拼接一个RequestMessage所需的完整ByteBuf
  2. MessageDecoder将消息解析为一个RequestMessage消息
  3. TransportChannelHandler将消息交给TransportRequestHandler具体处理
  4. TransportRequestHandler将ResponseMessage消息传递给MessageEncoder
  5. MessageEncoder把消息转换为ByteBuf(同上)

发送端接收响应消息:

  1. TransportFrameDecoder负责拼接一个消息所需的完整ByteBuf,如果是StreamResponse消息并且body是一个FileRegion,那么先拼接这个消息的ByteBuf(注意:StreamResponse消息最终传输到网络上时本身不包含FileRegion的ByteBuf)
  2. MessageDecoder将消息解析为一个ResponseMessage消息
  3. TransportChannelHandler将消息交给TransportResponseHandler具体处理
  4. 如果StreamResponse是一个包含FileRegion的消息,TransportResponseHandler在Channel Pipeline中添加一个handler:StreamInterceptor。TransportFrameDecoder将使用StreamInterceptor处理后续的FileRegion的ByteBuf。

spark2.1源码分析4:spark-network-common模块的设计原理的更多相关文章

  1. Spark源码分析之Spark Shell(下)

    继上次的Spark-shell脚本源码分析,还剩下后面半段.由于上次涉及了不少shell的基本内容,因此就把trap和stty放在这篇来讲述. 上篇回顾:Spark源码分析之Spark Shell(上 ...

  2. Envoy 源码分析--network L4 filter manager

    目录 Envoy 源码分析--network L4 filter manager FilterManagerImpl addWriteFilter addReadFilter addFilter in ...

  3. Envoy 源码分析--network

    目录 Envoy 源码分析--network address Instance DNS cidr socket Option Socket ListenSocket ConnectionSocket ...

  4. spark 源码分析之六--Spark RPC剖析之Dispatcher和Inbox、Outbox剖析

    在上篇 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRPCEnv 中,涉及到了Diapatcher 内容,未做过多的剖析.本篇来剖析一下它的工作原理. Dispatc ...

  5. spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析

    spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...

  6. 一个普通的 Zepto 源码分析(二) - ajax 模块

    一个普通的 Zepto 源码分析(二) - ajax 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块,以 ...

  7. 一个普通的 Zepto 源码分析(三) - event 模块

    一个普通的 Zepto 源码分析(三) - event 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块, ...

  8. jQuery 源码分析(十九) DOM遍历模块详解

    jQuery的DOM遍历模块对DOM模型的原生属性parentNode.childNodes.firstChild.lastChild.previousSibling.nextSibling进行了封装 ...

  9. spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv

    在前面源码剖析介绍中,spark 源码分析之二 -- SparkContext 的初始化过程 中的SparkEnv和 spark 源码分析之四 -- TaskScheduler的创建和启动过程 中的C ...

  10. jQuery 源码分析(二十一) DOM操作模块 删除元素 详解

    本节说一下DOM操作模块里的删除元素模块,该模块用于删除DOM里的某个节点,也可以理解为将该节点从DOM树中卸载掉,如果该节点有绑定事件,我们可以选择保留或删除这些事件,删除元素的接口有如下三个: e ...

随机推荐

  1. Golang中的函数

    函数 在go语言中,函数的基本组成为:关键字func.函数名.参数列表.返回值.函数体和返回语句 函数的定义 定义一个最简单的加法函数 func Add(a int,b int)(ret int,er ...

  2. 【Paywave】VISA Paywave - ICS category selection

    [ICS category Selection] PCDA & IRWIN compliantContact InterfaceMagnetic Stripe TransactionConta ...

  3. JSP中重定向页面没有全屏显示的问题解决

    <script type="text/javascript"> window.onload=function(){ if(window.parent != window ...

  4. Unity VS 创建脚本自动添加头注释-时间-描述-作者等信息

    Unity生成脚本自动添加头注释 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心 ...

  5. Linux上更换默认的java版本

    最近注意的一个问题: 在Server上和本地里都使用了相同版本的Tomcat,但是在Server上的tomcat日志里会出现很多java异常的错误, 但是本地的tomcat日志没有出现,初步判断应该是 ...

  6. linux文本编辑器vim大全

    linux基础之vim编辑器 1.vim编辑器 基本介绍 vim编辑器的前身叫做vi.vi的英文名:Visual  Interface.中文解释文本编辑器,你不应该用他去打开二进制可执行文件 文本编辑 ...

  7. 20155208徐子涵《网络对抗》Exp9 Web安全基础

    20155208徐子涵<网络对抗>Exp9 Web安全基础 实验要求 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 最后一次了,没有选择尝试免考项目 ...

  8. ajax的小知识---总是得到重复的数据

    按xmlhttp.open("GET","/try/ajax/demo_get.php",true);发送,可能会得到缓存中的结果; 可以改为xmlhttp.o ...

  9. JS制作图片切换

    <!DOCTYPE html> <html> <head> <title>纯JS制作简单的图片切换</title> <meta cha ...

  10. 【linux日常】 ACL权限管理

    ACL ((Access Control Lists) setfacl命令 这里引用一个非常详细的命令介绍. 要点: getfacl -R        递归获取acl权限,可以存储为文件以备还原 g ...