Thrift的TProcess类体系原理及源码详解

之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分 析了!会利用到自动代码生成的知识。

这部分是协议层和用户提供的服务实现之间的 纽带,定义了调用服务实现的接口框架,真正实现某种服务接口是通过上一章介绍的代码生 成工具生成的代码。本章将介绍这个框架的基本原理,然后通过生成的一个实例来具体介绍 怎样完成一次完整的服务,这个可能涉及到下面章节的一些知识,对于这些知识不详细分析 其功能,只是介绍它在其中起什么作用。选择的实例是Facebook内部用这个框架实现的一个 分布式日志收集系统scribe。下面是这部分相关类的类关系图:

从上图中可以看出TProcessor是这个部分的顶层基类,其他之类基本上都是通过Thrift代 码生成工具生成的,只有少数是为了扩展一些功能而直接写代码实现,如PeekProcessor类就 增加了一些对原始数据处理的功能。scribeProcessor和FacebookServiceProcessor类就是用 代码生成器根据IDL文件生成的,也是我们后面需要分析的一个实例。

第一节 服务 接口调用框架分析

这个基本的框架包括三个类,一个就是抽象类TProcessor,负责 调用用户定义的服务接口,从一个接口读入数据,写入一个输出接口。一个最主要的函数定 义如下:

virtual bool process(boost::shared_ptr<protocol::TProtocol> in,

                      boost::shared_ptr<protocol::TProtocol> out, void* connectionContext) = 0;

这个函数是一个纯虚函数,所以继承这个类的子类都必须实现这个函数,这个函 数就是最主要的数据传输功能。

第二个类就是负责处理TProcessor类产生的事件的类 TProcessorEventHandler,主要定义了一些当某事件发生时的处理函数,例如当读取参数之 前可以做一些处理功能。下面是这个类定义的各个成员函数,每一个函数都处理一种事件发 送时的情况:

最后一个类就是 TProcessorContextFreer类,这个类是一个帮助类,帮助生成的代码来释放上下文资源。

时间: 2024-10-25 16:33:09

Thrift的TProcess类体系原理及源码详解的相关文章

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCom

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCompactProtocol) 这个协议类采用了zigzag 编码,这种编码是基于Variable-length quantity编码提出来 的,因为Variable-length quantity编码对于负数的编码都需要很长的字节数,而zigzag 编 码对于绝对值小的数字,无论正负都可以采用较少的字节来表示,充分利用了 Varint技术. 所以这个协议类采用zigzag 编码可以节省传输空

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBi

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBinaryProtocol) 这个协议是Thrift支持的默认二进制协议,它以二进制的格式写所有的数据,基本上直接 发送原始数据.因为它直接从TVirtualProtocol类继承,而且是一个模板类.它的模板参数 就是一个封装具体传输发送的类,这个类才是真正实现数据传输的.这个类的定义上一节举 例已经出现过了就不在列出来了. 下面我就结合scribe的Log函数执行的具体过程来 分析使用这个协

Thrift的TProtocol类体系原理及源码详解:类继承架构分析

这部分相关的类主要实现与协议相关的内容,这里说的协议是指对数据传输格式封装的协 议,实现不同的协议来适合不同场景下的数据传输,因为在不同的场景下不同协议对于数据 传输来说效率有很大的差别.下面是这个部分相关类的类关系图: 由以上类图可以发现所有的协议类都从TProtocol类直接或间接继承,每一个协议 类都有一个对应的生产对象工厂(协议工厂).TProtocol是一个抽象的类,不能直接使用的 ,它有一个直接子类默认实现了所有方法(空实现),如果我们需要定义自己的数据传输协 议可以直接从这个类继承

thrift的TServer类体系原理及源码详解:服务器基类TServer

这一部分主要实现了底层IO通信,还涉及到通信服务器的堵塞.非堵塞.单线程.多线程 等运行模式,所以实现比较复杂.这一部分涉及到的类的关系图如下: 由上面的 类关系图可以看出,这一部分的类关系比较复杂,复杂的不是继承关系,而是相互之间的依 赖关系.因为服务器需要处理很多的任务,也需要处理多个客户端的连接,这就涉及到多线 程编程以及多线程之间通信及并发的情况.这一部分涉及到的并发编程的类容将在后面章节 单独分析,本章主要介绍服务器模型和IO通信的具体细节. 第一节 服务器基类 TServer 所有具

Thrift的TProtocol类体系原理及源码详解:JSon协议类TJSONProtocol

JSON (JavaScript Object Notation)是一种数据交换格式,是以JavaScript为基础的数 据表示语言,是在以下两种数据结构的基础上来定义基本的数据描述格式的:1) 含有名称/ 值对的集合:2) 一个有序的列表.对于 JSON,其部分数据结构的BNF 定义如下所示.形如{ "name":"ldxian","age":23}就表示一个JSON 对象,其有两个属性,值分别为ldxian 和23.其余的如数字.注释等跟其他

Thrift的TProtocol类体系原理及源码详解:其他协议类和总结

第六节 其他协议类 主要的协议类基本上已经介绍完毕了,当然如果你有更好的实 现和思路也可以实现自己的协议类,只要按照我前面介绍的类层次结构继承就可以了.除了 前面几节介绍的协议类,Thrift还实现了一些自己内部使用的协议类,例如TDebugProtocol 类,采用开发人员可读的文本协议,有助于调试,又例如TProtocolTap类,它可以使用两种 协议类进行两次协议转换.放一个窃听装置在协议对象,任何读取这个类都是通过一个封闭 的协议对象的,但也反映为写第二个协议对象,还有一个就是用于异常的

Thrift的TProtocol类体系原理及源码详解:稠密协议类TDenseProtocol

这个协议类不建议投入到实际的生产环境(除非自己做了很强的压力和全面的测试).这 个密集协议的最大作用就是尽可能使用小的空间,密集协议类有两种类型的实例对象,一种 是独立的,它不被使用在rpc通信中,而只是用于编码和解码:另一种是非独立的实例类型, 它可以用于rpc通信,不过现在还不支持这种类型的实例. 要使用这个密集协议类来 进行编码和解码必须支持Thrift自己实现的一直特殊的记录数据类型形式:就是type_spec属 性,它的主要作用就是用于本地化反射机制来进行读写数据. 最佳的实践方法如下

thrift的TTransport类体系原理及源码详细解析1-类结构和抽象基类

本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些 功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图, 如下: 由上面的类关系图可以看出,这部分的功能是相当的强大,所以类比较多且关系错综复杂.但是如 果理解清楚了这些类直接的关系就很容易掌握这部分的实现技术和这部分实现的功能.我们把这个类关 系图分为三部分来看,第一部分看抽象基类TTransport类,它是所有传输类的基类,有很大一部分类直 接从它继承实现它提供或者

Android Matrix源码详解_Android

Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.Android中的Matrix是一个3 x 3的矩阵,其内容如下:  Matrix的对图像的处理可分为四类基本变换: Translate           平移变换 Rotate                旋转变换 Scale                  缩放变换 Skew                  错切变换 从字面上理解,矩阵中的MSCALE用于处理缩放变换,MS