随笔分类 - Thrift
Facebook开源跨语言分布式数据传输框架Thrift研究!
摘要:帧传输类就是按照一帧的固定大小来传输数据,所有的写操作首先都是在内存中完成的直到调用了flush操作,然后传输节点在flush操作之后将所有数据根据数据的有效载荷写入数据的长度的二进制块发送出去,允许在接收的另一端按照固定的长度来读取。 帧传输类同样还是从缓存基类TBufferBase继承而来,实现的接口当然也基本相同,只是实现的方式不同而已,下面就来看看具体的实现过程和原理。 这个类所采用的默认缓存长度是512(static const int DEFAULT_BUFFER_SIZE = 512;),两个基本构造函数一个采用默认的缓存长度,另一个可以指定一个需要的缓存长度。下面还...
阅读全文
摘要:本节主要介绍缓冲相关的传输类,缓存的作用就是为了提高读写的效率。Thrift在实现缓存传输的时候首先建立一个缓存的基类,然后需要实现缓存功能的类都可以直接从这个基类继承。下面就详细分析这个基类以及一个具体的实现类。 缓存基类TBufferBase 缓存基类就是让传输类所有的读写函数都提供缓存来提高性能。它在通常情况下采用memcpy来设计和实现快路径的读写访问操作,这些操作函数通常都是小、非虚拟和内联函数。TBufferBase是一个抽象的基类,子类必须实现慢路径的读写函数等操作,慢路径的读写等操作主要是为了在缓存已经满或空的情况下执行。首先看看缓存基类的定义,代码如下: class ...
阅读全文
摘要:本节将介绍第一个实现具体传输功能的类TSocket,这个类是基于TCP socket实现TTransport的接口。下面具体介绍这个类的相关函数功能实现。 1.构造函数 分析一个类的功能首先看它的定义和构造函数实现,先看看它的定义:class TSocket : public TVirtualTransport { ......} 由定义可以看书TSocket继承至虚拟传输类,并且把自己当做模板参数传递过去,所以从虚拟传输类继承下来的虚拟函数(如read_virt)调用非虚拟函数(如read)就是TSocket自己实现的。 TSocket类的构造函数有4个,当然还有一个析构函数。四个构...
阅读全文
摘要:默认传输类TTransportDefaults提供了抽象类TTransport的默认实现,实现了非虚拟的方法(*_virt) read(), readAll(), write(),borrow() and consume()。基类TTransport总是调用对应的虚拟函数,而默认传输类按照默认的方式实现而不去自己在覆盖哪些对应的虚拟函数了。 其实这个默认传输类的主要作用是作为虚拟传输类TVirtualTransport的父类,那么为什么需要这个类作为虚拟传输类的父类而不是直接采用抽象基类?由下面介绍虚拟基类的实现方式来决定的,因为为了避免采用虚基类,所以虚拟传输类采用了模板的方式来实现多继承.
阅读全文
摘要:本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩、分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类关系图可以看出,这部分的功能是相当的强大,所以类比较多且关系错综复杂。但是如果理解清楚了这些类直接的关系就很容易掌握这部分的实现技术和这部分实现的功能。我们把这个类关系图分为三部分来看,第一部分看抽象基类TTransport类,它是所有传输类的基类,有很大一部分类直接从它继承实现它提供或者说定义的接口函数(纯虚函数),这些传输类功能比较单一实现也比较简单;第二部分就是TTransport抽象类的.
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。第六节其他协议类主要的协议类基本上已经介绍完毕了,当然如果你有更好的实现和思路也可以实现自己的协议类,只要按照我前面介绍的类层次结构继承就可以了。除了前面几节介绍的协议类,Thrift还实现了一些自己内部使用的协议类,例如TDebugProtocol类,采用开发人员可读的文本协议,有助于调试,又例如TProtocolTap类,它可以使用两种协议类进行两次协议转换。放一个窃听装置在协议对象,任何读取这个类都是通过一个封闭的协议对象的,但也反映为写第二个协议对象,还有一个就是用于异常的
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这个协议类不建议投入到实际的生产环境(除非自己做了很强的压力和全面的测试)。这个密集协议的最大作用就是尽可能使用小的空间,密集协议类有两种类型的实例对象,一种是独立的,它不被使用在rpc通信中,而只是用于编码和解码;另一种是非独立的实例类型,它可以用于rpc通信,不过现在还不支持这种类型的实例。要使用这个密集协议类来进行编码和解码必须支持Thrift自己实现的一直特殊的记录数据类型形式:就是type_spec属性,它的主要作用就是用于本地化反射机制来进行读写数据。最佳的实践方法如下
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。JSON(JavaScriptObjectNotation)是一种数据交换格式,是以JavaScript为基础的数据表示语言,是在以下两种数据结构的基础上来定义基本的数据描述格式的:1)含有名称/值对的集合;2)一个有序的列表。对于JSON,其部分数据结构的BNF定义如下所示。形如{“name”:”ldxian”,”age”:23}就表示一个JSON对象,其有两个属性,值分别为ldxian和23。其余的如数字、注释等跟其他编程语言差不多。下面就开始看看facebook的thrift
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这个协议类采用了zigzag编码,这种编码是基于Variable-lengthquantity编码提出来的,因为Variable-lengthquantity编码对于负数的编码都需要很长的字节数,而zigzag编码对于绝对值小的数字,无论正负都可以采用较少的字节来表示,充分利用了Varint技术。所以这个协议类采用zigzag编码可以节省传输空间,使数据的传输效率更高。至于zigzag具体的编码实现方式可以网上查查,其实就是把从低位到最后一个还存在1(二进制)的最高位表示出来就可以
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这个协议是Thrift支持的默认二进制协议,它以二进制的格式写所有的数据,基本上直接发送原始数据。因为它直接从TVirtualProtocol类继承,而且是一个模板类。它的模板参数就是一个封装具体传输发送的类,这个类才是真正实现数据传输的。这个类的定义上一节举例已经出现过了就不在列出来了。下面我就结合scribe的Log函数执行的具体过程来分析使用这个协议所执行的功能,看看二进制协议是怎样工作的。RPC调用使用到协议部分主要是在发送函数相关信息到服务器和接收服务器返回结果。现在..
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这部分相关的类主要实现与协议相关的内容,这里说的协议是指对数据传输格式封装的协议,实现不同的协议来适合不同场景下的数据传输,因为在不同的场景下不同协议对于数据传输来说效率有很大的差别。下面是这个部分相关类的类关系图:由以上类图可以发现所有的协议类都从TProtocol类直接或间接继承,每一个协议类都有一个对应的生产对象工厂(协议工厂)。TProtocol是一个抽象的类,不能直接使用的,它有一个直接子类默认实现了所有方法(空实现),如果我们需要定义自己的数据传输协议可以直接从这个类继
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。 之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分析了!会利用到自动代码生成的知识。 这部分是协议层和用户提供的服务实现之间的纽带,定义了调用服务实现的接口框架,真正实现某种服务接口是通过上一章介绍的代码生成工具生成的代码。本章将介绍这个框架的基本原理,然后通过生成的一个实例来具体介绍怎样完成一次完整的服务,这个可能涉及到下面章节的一些知识,对于这些知识不详细分析其功能,只是介绍它在其中起什么作用。选择的实例是Facebook内部用这个框架实..
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。3生成C++语言代码的代码详解这个功能是由t_cpp_generator类实现(在文件t_cpp_generator.cc定义和实现),直接继承至t_oop_generator类(这个类是所有面向对象语言生成器类的直接基类,封装了面向对象语言生成器共有的特征与行为),而t_oop_generator又从t_generator继承(上面已经介绍),下面详细分析这个类是怎样生成C++语言的代码文件的。这个还有从上面介绍的generate_program函数开始说起,因为这个函数才是控制
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。2t_generator类和t_generator_registry类这个两个类的主要功能就是为生成所有语言的代码提供基础信息和提供具体代码生成器对象,上面就是调用这个两个类的方法来生成具体语言的代码生成器对象和执行生成代码的功能函数。下面主要分析两个函数的功能,一个是t_generator_registry类的get_generator函数,这个是一个静态的函数可以直接通过类调用;另一个是t_generator类的generate_program函数。(1)t_generator
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。又很久没有写博客了,最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是由于调试GlusterFS的一些新增功能就用了整整的一天,还有一天就陪老婆大人逛街去了!今晚浏览完微博发现时间还早就来博客一篇,本篇博客内容主要是前一段时间研究的Thrift的代码生成器的源码详细分析,没有具体分析语法解析,因为是工具字段生成的代码,人是没有办法阅读的----到处都是跳转表!由于Thrift支持N多种语言,但是生成代码原理都差不多,我主要分析了C++相关代码生成。关于Thrift的使用
阅读全文
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。以下内容是从网上各处简单整理而来,因为前段时间自己一直在研究Thrift,把研究的一点资料分享给需要的同行中人!第一节 RPC技术及实现简介首先思考一下分布式系统中的 RPC (Remote Procedure Call) 问题,一个完整的 RPC 模块需要可以分为三个层次· 服务层(service):RPC 接口定义与实现· 协议层(protocol):RPC 报文格式和数据编码格式· 传输层(transport):实现底层的通信(如 socket)
阅读全文