当前位置: 代码迷 >> 综合 >> thrift 协议栈
  详细解决方案

thrift 协议栈

热度:53   发布时间:2024-01-14 08:23:46.0
整体分层

如图所示,第一层是代码层属于生成的代码和我们自己的逻辑。
第二层属于Protocol 协议层。
第三层属于Transport 传输层。
在这里插入图片描述

TProtocol

这层主要负责的是数据格式,一般默认使用的是 BinaryProtocol。这层提供如下协议

  • TBinaryProtocol 直接使用二进制编码传输而非文本
  • TCompactProtocol 压缩编码传输数据,这层相当高效
  • TDenseProtocol 它相似于 TCompactProtocol ,但是这层在传输过程中不带相关元信息而是在接收者接收的再加上元信息。
  • TJSONProtocol 使用json 编码数据
  • TDebugProtocol 这层主要用于Debug出thrift结构的信息。常用于
TTransport

transport(传输层)主要负责传输格式. Thrift 支持如下transport层

  • TSocket 使用阻塞Socket I/O
  • TFramedTransport 以帧为单位发生数据,每一帧的起始部分有该数据的长度,Frame 为 datalength data的拼接。当我们使用非阻塞Server的时候必须得使用这个Transport
  • TFileTransport 这个transport 是用来文件I/O
  • TMemoryTransport 这层就是普通的内存copy。就像普通的我们在应用层申请一个buffer来I/O一样
  • TZlibTransport 使用zlib来压缩数据。它通常与其他 transport一起使用,这个 Transport Java 并不支持。
  • THttpTransport.h 一个用来走Http协议的transport
  • TServerTransport 这个transport 不是用来传输数据的,它像一个Handle 主要用来管理 一个具体的 transport类,它是一个基本的Server 框架中的一个用于管理数据传输的抽象类。目前根据查看 thrift 0.9.3 源码可查出,只有TServerSocket 继承了它实现了相应的接口。然后TServerSocket可直接被其管理。(thrift 设计这个类可能是为了以后有更多的类似TServerSocket的传输类,这样都可以继承 TServerTransport 然后被其管理)
TProcesser

TProcesser主要负责从上面的 Protocol中读取数据,然后转发给handler,然后把结果输回到Protocol中。
一般Processer也是由thrift自动生成的,我们只需要负责具体的handler函数的编写。

Tserver

Tserver主要负责把上面的processor,protocol,transport组合到一起,然后实现一个thrift服务,一般这个默认是TSimpleServer类型。不同的Server类对应不同的I/O模型,我们可以设置相应的模型

  • TSimpleServer 一个单线程的阻塞I/O Server,一般用于测试
  • ThreadPoolServer 一个多线程阻塞I/O Server one Thread per connection
  • TNonblockingServer //非阻塞I/O模型的多路复用, 可选择单线程或者线程池版本,这个Server 必须使用 TFramedTransport 协议为这个Server.
    这里写图片描述
  • THsHaServer //非阻塞I/O 半同步半反应堆模型
    这里写图片描述
  • TThreadSelectorServer//半同步半异步并发模型,是thrift最高级的服务模型。它对上面这个模型的优化在于主线程不在负责磁盘I/O,它只负责监听,磁盘I/O有SelectorThread去负责(I/O复用),具体逻辑handler的执行有Excutor线程。如下图SubReactor就是SelectorThread。但是c++不支持这个模型,java支持超级遗憾
TThreadSelectorServerI/O 模型

这里写图片描述

TThreadSelectorServer 线程模型

这里写图片描述

总结

一般我们不需关注上面这么多的东西,我们只需自己写 handler函数即可,剩下的函数thrift都会帮我们生成。其次,如果我们想换Server模型了,这个是很重要的,我们可以换上面的几种Server模型来提高性能