Thrift(三)——传输层、协议、处理器、服务端
程序员文章站
2022-06-17 12:02:01
...
下图为Thrift的网络堆栈结构简单表示
传输层(Transport)
传输层提供了一个简单的抽象,以用于从/向网络读/写。这使得Thrift能够将底层传输与系统的其他部分隔离(例如序列化/反序列化)
以下是Transport接口提供的一些方法:
- open
- close
- write
- read
- flush
除了上面的Transport接口以外,Thrift还提供ServerTransport来接收/创建原始传输对象。顾名思义,ServerTransport主要用于服务端,为传入连接创建新的传输对象。
- open
- listen
- accept
- close
以下是Thrift所支持的大部分语言都可用的一些传输:
- file:从/向磁盘上的文件读/写
- http
协议(Protocol)
协议抽象定义了一种将内存数据结构映射为wire-format的机制。换句话说,协议指定数据类型如何使用传输层来对自身编码/解码。所以说协议实现控制编码方案并负责(反)序列化。常用的几种协议:
协议抽象定义了一种将内存数据结构映射为wire-format的机制。换句话说,协议指定数据类型如何使用传输层来对自身编码/解码。所以说协议实现控制编码方案并负责(反)序列化。常用的几种协议:
- TBinaryProtocol:二进制编码格式传输
- TCompactProtocol:高效密集的二进制编码格式传输
- TDenseProtocoal:与TCompactProtocol相比,meta信息略有不同
- TJSONProtocol:使用JSON编码格式传输
- TDebugProtocoal:文本格式 方便调试
Thrift协议是面向流式的,不需要任何明确的架构,比如说在序列化时,不需要提前知道字符串的长度或是列表的元素数量。
处理器(Processor)
Thrift处理器封装了从输入流读取数据和写入输出流的功能。输入和输出流由Protocol对象表示。处理器的接口也很简单
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
处理器的类型有以下几种:
- TSocket:阻塞的io
- TFramedTransport:非阻塞io
- TFileTransport:可以将一组thrift请求写到文件中
- TMemoryTransport:使用内存 I/O
- TZlibTransport:使用zlib压缩
服务端的特殊处理器由Thrift编译器生成。处理器从网络通道上读取数据(通过输入协议),将处理委托给处理程序(由用户实现),并通过通道写入响应(通过写出协议)
服务端(Server)
服务端汇集了上述各种功能:
- 创建Transport
- 为Transport创建读/写协议
- 基于协议创建处理器
等待传入连接并将其转交给处理器
服务端的类型有以下几种:TSimpleServer:简单的阻塞式单线程模式
- TNonblockingServer:非阻塞式单线程模式(利用NIO的方式实现)
- TThreadPoolServer:线程池模式。主线程负责监听连接请求,其他线程负责处理请求
- THsHaServer:半同步半异步模式。是TNonblockingServer的子类,引入了线程池,主线程负责监听请求,读取数据,然后交由线程池处理请求。(需要制定Transport为TFramedTransport)
- TThreadedSelectorServer:这是Thrift目前提供的*的模式,它有一个专门的AcceptThread来监听连接请求,因此能够及时响应大量并发连接请求;有连接请求进来时,AcceptThread将网络I/O操作分散到多个SelectorThread线程中来完成,因此能够快速对网络I/O进行读写操作,能够很好地应对网络I/O较多的情况;由一个负载均衡器SelectorThreadLoadBalancer对象将请求分配到不同的SelectorThread;在SelectorThread得到请求后,将请求转发给ExecutorService类型的工作线程池中的线程,进行具体的业务处理。
(几种不同的服务端类型的具体使用在下一节讲述)
Thrift系列博客:
Thrift(一)——基本使用与概念
Thrift(二)——数据类型
Thrift(三)——传输层、协议、处理器、服务端
Thrift(四)——几种服务端类型