`

Thrift概述

 
阅读更多


Thrift是跨语言的RPC框架,现在是一个Apache的顶级项目。Thrift通过一个中间语言--IDL接口定义语言,来定义RPC的接口和数据类型。使用Thrift的代码生成工具(thrift-0.9.1.exe编译器)读取IDL文件,生成不同语言的服务端与客户端代码,并由生成的代码负责RPC协议层和传输层的实现。目前支持语言C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk

基本概念
Thrift中的几个概念:
Server 服务模型
Handler 数据处理接口
Processor 数据处理对象
Protocol 数据传输协议
Transport 数据传输方式

(1)支持的传输格式
TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug
 

(2) 支持的通信方式(数据传输方式)(Transport)
TFileTransport:文件(日志)传输类,允许client将文件传给server,允许server将收到的数据写到文件中。
THttpTransport:采用Http传输协议进行数据传输
TSocket:采用TCP Socket进行数据传输
TZlibTransport:压缩后对数据进行传输,或者将收到的数据解压
 

下面几个类主要是对上面几个类地装饰(采用了装饰模式),以提高传输效率。
TBufferedTransport:对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer
TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用。同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收。
TMemoryBuffer:从一个缓冲区中读写数据
 


(3)支持的服务模型
TSimpleServer – 简单的单线程服务模型,常用于测试
TThreadedServer - 多线程服务模型,使用阻塞式IO,每个请求创建一个线程。
TThreadPoolServer – 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。
TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)
 
处理大量更新的话,主要是在TThreadedServer和TNonblockingServer中进行选择。TNonblockingServer能够使用少量线程处理大量并发连接,但是延迟较高;TThreadedServer的延迟较低。实际中,TThreadedServer的吞吐量可能会比TNonblockingServer高,但是TThreadedServer的CPU占用要比TNonblockingServer高很多。


服务端编写的一般步骤:
1. 创建Handler
2. 基于Handler创建Processor
3. 创建Transport(通信方式)
4. 创建Protocol方式(设定传输格式)
5. 基于Processor, Transport和Protocol创建Server
6. 运行Server
 
 
客户端编写的一般步骤:
1. 创建Transport
2. 创建Protocol方式
3. 基于Transport和Protocol创建Client
4. 运行Client的方法


需要注意的问题
 
1. Thrift生成的server端是thread safe的. 但是client端不是thread safe. 所以需要多个thread和server端通信,则每个thread需要initiate一个自己的client实例.
 
2. 如果服务器采用TNonblockingServer的话,客户端必须采用TFramedTransport。程序链接的时候需要thriftnb。
3. 默认TServerSocket和TSocket都设置了NoDelay为1,使得报文尽快发送出去,如果客户端和服务器间传输数据量较大,通过可以设置NoDelay为0来开启Nagel算法,缓存一段数据后再进行发送,减少报文数量。
TSocket默认开启了Linger,并设置linger time为0,这样close会丢弃socket发送缓冲区中的数据,并向对端发送一个RST报文,close不会被阻塞,立即返回。
TServerSocket默认关闭了Linger,close不会被阻塞,立即返回。
4. fb303作为handler的基类,里面预置了一些rpc方法,用于监控,包括系统状态,请求次数等状态信息。
thrift文件中需要include "fb303.thrift"这样来将service导入目标thrift文件中。thrift编译后的代码只需要相应的Handler多重继承facebook::fb303::FacebookBase就好了。
class scribeHandler : virtual public scribe::thrift::scribeIf,
                               public facebook::fb303::FacebookBase {

5.async有些问题,编译自动生成的代码需要TEventServer.h(0.7.0和svn trunk都是如此),但是thrift中没有这个文件。contrib/async中有一个http的异步测试代码,大致看了一下实现,使用std::tr1::function和std::tr1::bind实现完成回调函数,实现Processor的异步处理,增加了TAsyncProcessor,其process函数返回的时候,真正的逻辑可能没有完成,依赖完成回调函数处理请求完成的部分,对于服务器端来讲主要是将response发送给客户端。一般RPC业务同步的TProcessor就可以了,只有类似proxy这种中间服务需要异步处理,不过当前thrift中只有TEvhttpServer可用;-)

6.不支持返回值为空,如果返蜀犬吠日null会导致TApplicationException异常,可以捕获判断type并返回null
if (ee instanceof TApplicationException  && ((TApplicationException) ee).getType() ==   TApplicationException.MISSING_RESULT){

分享到:
评论
1 楼 rgqancy 2016-05-19  
不错不错!

相关推荐

    ThriftBook:《 Apache Thrift程序员指南》中示例的源代码

    Apache Thrift程序员指南以下示例中的源代码:Apache Thrift程序员指南 本书分为三个部分:第一部分-Apache Thrift概述对Apache Thrift及其体系结构的高级介绍。 这部分的例子非常有趣。 本部分还介绍了基本的Apache...

    go-thrift, Go的本机 Thrift 包.zip

    go-thrift, Go的本机 Thrift 包 Thrift 封装 API文档:http://godoc.org/github.com/samuel/go-thrift许可证3-clause BSD请参见许可证文件。概述Thrift 是一个可以用来为各种语言生成RPC客户

    maven-thrift-plugin:将 thrift 文件生成为源代码的 Maven Thrift 插件

    目标概述 generate-java绑定到 generate-sources 阶段,用于编译 thrift 文件。 generate-java-test绑定到 generate-test-sources 阶段,用于编译测试 thrift 文件。 执行参数 节俭可执行文件 指向thrift的路径,...

    tchannel-go:Go实现RPC调用的多路复用和成帧协议

    如果您想开始编写小型Thrift和TChannel服务,请参阅。 对于一些自以为是的设置,请参阅。 概述 TChannel是一种网络协议,它支持: 请求/响应模型, 在同一个TCP套接字上复用多个请求, 乱序回复, 流式传输请求...

    Spark 2.0.2 Spark 2.2 中文文档 本资源为网页,不是PDF

    运行 Thrift JDBC/ODBC 运行 Spark SQL CLI 迁移指南 从 Spark SQL 1.6 升级到 2.0 从 Spark SQL 1.5 升级到 1.6 从 Spark SQL 1.4 升级到 1.5 从 Spark SQL 1.3 升级到 1.4 从 Spark SQL 1.0~1.2 升级到 ...

    Spark分布式内存计算框架视频教程

    11.分布式SQL引擎(spakr-sql和Spark ThriftServer) 12.Catalyst 优化器 第四章、离线综合实战 1.综合实战概述(需求、调研、业务) 2.环境搭建(大数据环境和应用开发环境) 3.项目初始化(工具类和属性文件) 4....

    katran:高性能第4层负载均衡器

    文件(此文件)-katran的概述。 -有关如何使用,配置或更改katran库的详细说明。 -描述开发过程的样子:如何构建和测试katran。 -输出如何运行提供的示例(使用katran库的Thrift和 ) 使用范例 我们提供了使用...

    diskoveror-ta:工作区包含核心的文本分析引擎,该引擎又可以最佳地利用多个开源软件包

    概述DisKoveror是Serendio开发的文本分析引擎。 它建立在其他开源软件包之上,提供了一种灵活且可扩展的方法,可从非结构化文本中提取实体,主题,类别,情感和关键字,无论其来源如何。 Diskoveror已用于从社交媒体...

    tchannel:RPC的网络复用和成帧协议

    概述 TChannel是用于通用RPC的网络成帧协议,以极高的性能支持乱序响应,其中中介可以快速做出转发决策。 它很容易以多种语言实现,尤其是JavaScript和Python。 设计目标 多种语言轻松实现 高性能转发路径,中介可以...

    bloom-server:BloomFilter服务器

    Bloom Server提供REST和Thrift API来访问集中的数据。 发行说明 最新版本: 0.1.1 。 参见 。 蜜蜂 put(item[, bloomName]) :将项目放入Bloom过滤器。 mightContain(item[, bloomname]) :测试项目是否已放入...

    LuceneServer:Lucene的网络服务器接口(http

    Bloom Server提供REST和Thrift API来访问集中的数据。 发行说明 最新版本: 0.1.0 。 参见 。 蜜蜂 put(item[, bloomName]) :将项目放入Bloom过滤器。 mightContain(item[, bloomname]) :测试项目是否已放入...

    accumulo-opentsdb:异步hbase的实现,该实现使用累积后端将opentsdb移植到累积

    此自述文件为您提供了在opentsdb安装的顶部添加accumulo-opentsdb的步骤的概述,以将时间序列数据而不是HBase放入accumulo。 依赖 在添加此补丁之前,我们假设您已经安装了以下软件: Maven 3.1.0(有关下载和安装...

    RecordServiceClient

    概述 RecordService是一项新服务,为MR和Spark等框架提供了通用API,以从Hadoop存储管理器读取数据并将其作为规范记录返回。 这消除了应用程序和Hadoop组件支持单个文件格式,处理数据安全性,执行审计,实施复杂的...

    vagrant-hbase:一个Vagrantfile来启动和运行Hadoop和HBase开发

    概述 该项目的目的是在短短几分钟内建立一个可用于Hadoop和HBase开发的虚拟机。 VM是Ubuntu 14.04(可信任)盒,已通过。 在运行了vagrant up ,将以伪分布式模式设置单个HBase节点,并在单节点Hadoop HDFS文件系统...

    Hadoop实战手册

    文档概述32. 背景33. 名词解释44. 服务器结构4#Hadoop试验集群的部署结构4#系统和组建的依赖关系5#生产环境的部署结构65. Red hat Linux基础环境搭建6#linux 安装 (vm虚拟机)6#配置机器时间同步6#配置机器网络环境7...

    Hbase中文文档

    10.3. Thrift 11. 性能调优 11.1. 操作系统 11.2. 网络 11.3. Java 11.4. HBase 配置 11.5. ZooKeeper 11.6. Schema 设计 11.7. 写到 HBase 11.8. 从 HBase读取 11.9. 从 HBase删除 11.10. HDFS 11.11. Amazon EC2 ...

    大数据流处理框架介绍.pdf

    ⼤数据流处理框架介绍 ⼤数据流处理框架介绍 实时流处理简单概述:实时是说整个流处理相应时间较短,流式计算是说数据是源源不断的,没有尽头的。实时流处理⼀般是将业务系 统产⽣的数据进⾏实时收集,交由流处理...

Global site tag (gtag.js) - Google Analytics