MENU

RPC框架之thrift学习笔记之二

前言

上一篇RPC框架之thrift学习笔记之一了解了thrift安装、常用数据类型及关键字。现在来聊聊thrift的协议栈结构吧。

thrift协议栈结构

图片是网上找来的。

20194
thrift是一种c/s的架构体系,通过代码生成工具将thrift文件生成服务器端、客户端代码,从而实现服务端、客户端跨语言的支持。

  • Code层:即为用户实现的业务逻辑代码

  • Generated Code层:由thrift编译器自动生成的代码,IDL规定相应的接口定义语言编译产生的代码。(分为服务端、客户端)

  • TProtocol(协议层):定义数据传输格式(支持五种),将结构化数据转化为字节流传给下一层。

    # TBinaryProtocol:使用二进制编码格式传输,默认传输协议
    # TCompactProtocol:使用压缩格式传输
    # TJSONProtocol:使用JSON格式传输
    # TDebugProtocol:使用易懂可读的文本格式进行传输,便于debug调试
    # TSimpleJSONProtocol:提供JSON只写的协议,容易通过脚本语言解析
    
  • TTransport(传输层):定义数据传输方式(支持五种),负责以字节流方式接收和发送消息体。

    # TSocket:阻塞式socket,用于客户端
    # TServerSocket:非阻塞式socket,用于服务端监听socket
    # TNonblockingSocket:非阻塞式IO,用于构建异步客户端
    # TMemoryInputTransport:封装了一个字节数组byte[]来做输入流的封装
    # TFramedTransport:非阻塞式,以Frame为单位进行传输,按块的大小进行传输,类似于 Java 中的 NIO
    
  • I/O层:负责数据传输

thrift支持的服务模型

  • TSimpleServer

    该工作模式采用最简单的阻塞IO,只有一个线程,循环监听传过来的请求并对其处理,一次只能接收处理一个socket连接,因为效率比较低,一般用于开发时候演示工作过程。

  • TNonblockingServer

    相对比TSimpleServer,它采用NIO,也就是非阻塞式IO的方式实现IO的多路复用,它同时监听多个socket变化,但业务处理依然是单线程模式,对于一些复杂耗时任务效率依然不高,多个任务需要排队处理。

  • THsHaServer

    相对比TNonblockingServer,它引入线程池去处理,其模型吧读写任务放到线程池去处理。THsHaServer是Half-sync/Half-async的处理模式, Half-aysnc是在处理IO事件上(accept/read/write io), Half-sync用于handler对rpc的同步处理上。THsHaServer在完成数据读取之后,将业务处理过程交由一个线程池来完成,主线程直接返回进行下一次循环操作,效率大大提升,但是主线程需要完成所有socket的监听以及数据读写,当请求书较大且发送数据量较多,监听的socket请求不能被及时处理。

  • TThreadPoolServer

    该模式采用阻塞socket方式工作,主线程负责阻塞式监听新的socket请求,业务处理则交由一个线程池来处理。这样当并发量较大但不超过线程池数量每个请求都能及时处理,效率高,但是当并发量超过线程池数量后来的请求则需要排队等待。

  • TThreadedSelectorServer

    该模式是目前thrift提供的最高级的模式,它也是种Half-sync/Half-async的服务模型。在该模式中有一个专门的线程AcceptThread用于处理新连接请求,因此能够及时响应大量并发连接请求,另外它将网络I/O操作分散到多个SelectorThread线程中完成,因此能够快速对网络I/O进行读写操作,能够很好地应对网络I/O较多的情况。

参考文章Thrift RPC实战(二) Thrift 网络服务模型

标签: RPC, Thrift
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码