thrift使用小记_CUDev-ChinaUnix博客

thrift使用小记
(2011-09-19 21:28)
标签: 
客户端 
接口 
Facebook 
transport 
protocol 
分类: 程序设计
    Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。
Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。
基本概念
Thrift中的几个概念:
Server 服务模型
Handler 数据处理接口
Processor 数据处理对象
Protocol 数据传输协议
Transport 数据传输方式
Handler为抽象接口,需要在编译后的代码上自行实现。Processor调用Handler中的代码,编译自动生成,不用关心。
(1)支持的传输格式
TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug

(2) 支持的数据传输方式
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高很多。
安装与使用
thrift的安装需要注意实现安装一些库。
thrift的C++编译器使用了boost中的shared_ptr,如果需要配合c++使用的话,需要先安装boost。
如果要使用NonBlockingServer的话,需要安装libevent。
thrift的使用的时候,首先定义一个idl文件(interface description language),然后使用thrift编译出相应的代码。
thrift --gen cpp XYZ.thrift
我们需要记住的是: Thrift帮你生成了给定Service的服务器端和客户端代码.Thrift这里的命名规则是对于Service XYZ, 它对应的服务器端代码(具体这个Service的执行)在类XYZHandler中,客户端代码(负责marshall, execute RPC)在类XYZClient中. 所以你需要用这个服务, 你只需要直接修改或者继承这些类.

服务器编写的一般步骤:
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的方法
创建Transport的时候,一般都需要创建相应的Socket。
示例代码
附上一份周末写的测试代码,用thrift将leveldb封装了一个网络服务。其中包含各种服务模型。
 kv.rar   
需要注意的问题
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就好了。
  1. class scribeHandler : virtual public scribe::thrift::scribeIf,
  2. public facebook::fb303::FacebookBase {
5. 可以将ZeroMQ等作为transport使用其zeromq来进行通讯。
 可以参考thrift-0.7.0/contrib/zeromq中的代码。【未进行测试】
https://issues.apache.org/jira/browse/THRIFT-812
6. thrift支持完全async,生成代码的时候需要使用
 thrift --gen cpp:cob_style xxx.thrift
这样的话,生成的代码需要TEventServer.h,但是async目录下没有,只有TEvhttpServer.h
https://github.com/klickverbot/thrift/commit/5ddabb8e3f63a15874e436c9a650dc17f7dd7028#diff-2
【注意】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可用;-)
  
参考
http://dongxicheng.org/search-engine/thrift-framework-intro/
http://dongxicheng.org/search-engine/thrift-guide/
http://dongxicheng.org/search-engine/thrift-rpc/
http://diwakergupta.github.com/thrift-missing-guide/

thrift使用小记_CUDev-ChinaUnix博客相关推荐

  1. 使用Windows live Writer 2012发布ChinaUnix博客

    最近打算把博客相应的文章发布到ChinaUnix上,找了很多的文章终于找到如何发表,记录如下. 有关windows live writer的安装可以参考,我另外一篇文章.<烂泥:用Windows ...

  2. QT 生成的exe 无法打开 说缺少QTCORED4.DLL文件-三点水兽-ChinaUnix博客

    还需要已经运行时提示缺少的组件添加一些dll 来源:http://blog.chinaunix.net/uid-20620288-id-3356186.html#0-hi-1-67586-89fdc6 ...

  3. 征途linux编译错误,征途误事-山外メ雲ジ-ChinaUnix博客

    1.使用mini2440, 用 SD 卡作根文件系统时,拷贝别人弄好的文件系统后,开机遇到这样的警告: WARNING: Unable to open an initial console ,而且串口 ...

  4. 滑动窗口与拥塞窗口_流云哭翠-ChinaUnix博客

    一.滑动窗口 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的. 对ACK的再认识,ack通常 ...

  5. Git 存储过程探究_无赖皮肤-ChinaUnix博客

    1一些基础概念 1.1SHA1 SHA1是密码学上的一种算法,git通过它来识别文件.在git中,通过对"对象"进行计算得来的SHA1,来得到对该文件项目的索引.其中SHA1值是一 ...

  6. 最小生成树的纠结_交流电之王-ChinaUnix博客

    假期里面系统地研究了一下最小生成树,下面就跟大家分享一下心得.最小生成树(Minimum Spanning Tree, MST)是图论的一个分支,主要用于从一个包含n个结点的连通图中提取出一个包含全部 ...

  7. oracle 碎片高的表,表的碎片化-oracle狂热分子-ChinaUnix博客

    表的碎片和文件系统的碎片化的是不一样的,当随着在一个表上的DML的上 操作越来越多时,HWM之前可能有很多空闲空间,而在读取表时HWM以下的块都会被 读进来,这样会产生更多的IO,从而影响性能.只有在 ...

  8. ARM经典300问(来源: ChinaUnix博客)

    为什么80%的码农都做不了架构师?>>>    写在前面 自己看过非常的好,或分享,或保留着自己以后再看看,, ARM经典300问   第1 章 体系结构 第1 问: Q:请问在初始 ...

  9. Blog_Backup:绿色博客备份工具

    Blog_Backup 是一款功能完善的博客备份软件,支持国内所有大型BSP,可导出内容为多种格式.支持的导出的格式包括:RSS 1.0,RSS 2.0,Atom 0.3,单个网页(正序.反序),多个 ...

  10. 中国最火最流行的40个博客网站

      设置 添加到我的博客 日志           博客网站地址大全 http://blog.qiandu.com/ 1 博客中国 http://blog.blogchina.com 2你的博客网 w ...

最新文章

  1. 关于xilinx fir use reloadable coefficient的用法
  2. DataSet.Relations一例
  3. 工作中如何使用线程池的?自己如何定义一个线程池?
  4. Scala数组和Java集合List的互转
  5. C++结合插入排序和合并排序的算法(附完整源码)
  6. [IDEA] 异常 Configuration is still incorrect. Do you want to edit it again? Error: module not specifie
  7. java mapreduce 标准差_MapReduce设计模式之概要设计模式
  8. 面对面交流的好处_我们的交流方式是如何被网络社交媒体一步步改变的
  9. 深入浅出深度学习(四)概率统计基础
  10. 在服务器上导出dmp文件,远程在服务器上导出dmp文件
  11. 转:完整的最简单的谱聚类python代码
  12. C++字符串可以这样用!
  13. frame越过另一个frame_Python3.6实现一个简单的文本编辑器
  14. 一键AI绘画-生成自己想要生成的图片(你懂的)。
  15. libcrypto yum 安装_CentOS升级OpenSSL至OpenSSL 1.1.0f版本其中有遇到libcrypto.so的问题...
  16. 企业业务流程管理软件功能简介
  17. 普适计算Topic推荐-AMiner
  18. Windows 10快速删除大量回收站文件以及由此引起的回收站右键清空反应慢问题的解决
  19. 题目1:MySQL基本练习【单、多表】
  20. HTML辅助下载个人官网源码+UI非常不错

热门文章

  1. 深度学习与计算机视觉系列(8)_神经网络训练与注意点
  2. python formatters 与字符串 小结 (python 2)
  3. 烂泥:nginx、php-fpm、mysql用户权限解析
  4. application/x-www-form-urlencoded multipart/form-data text/plain 的区别和作用
  5. HDOJ-2012 素数判定
  6. 来自mooon的最简单的日志类CSimpleLogger
  7. Ubuntu触摸板使用
  8. dataGridView 数据绑定
  9. 实验问题总结与分享之×××(Virtual Private Network)
  10. PrestaShop 网站后台配置(三)