Thrift服务端的5种工作模式

Posted 麦克叔叔每晚10点说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift服务端的5种工作模式相关的知识,希望对你有一定的参考价值。

Thrift是一个软件框架,为服务端提供了多种工作模式,包括5种工作模式:TSimpleServer、TNonblockingServer、THsHaServer、TThreadPoolServer、TThreadSelectorServer。


  • TSimpleServer的工作模式只有一个工作线程,循环监听新请求逇到来并完成对请求的处理,该模式采用最简单的阻塞I/O,一次只能接收和处理一个Socket连接,效率比较低。


  • TNonblockingServer的工作模式也是单线程工作,但是该模式采用NIO的方式,所有的Socket都被注册到Selector中,在一个线程上通过Selector循环监控所有的Socket,每次Selector结束时,处理所有的处于就绪状态的Socket,对于有数据到来的Socket进行数据读取操作,对于有数据发送的Socket则进行数据发送,对于监听Socket则产生一个新业务Socket并将其注册到Selector中。相比于TSimpleServer效率,提升主要体现在I/O多路复用上,TNonblockingServer采用非阻塞I/O,同时监控多个Socket的状态变化。TNonblockingServer模式在业务处理上还是采用单线程顺序来完成,在业务处理比较复杂、耗时的时候,例如某些接口函数需要读取数据库执行时间较长,此时该模式效率也不高,因为多个调用请求任务依然是顺序一个接一个执行。


  • THsHaServer类是TNonblockingServer类的子类,在TNonblockingServer模式中,采用一个线程来完成对所有Socket的监听和业务处理,造成了效率的底下,而THsHaServer模式中,引入一个线程池来专门进行业务处理。与TNonblockingServer模式相比,THsHaServer在完成数据读取之后,将业务处理过程交由一个线程池来完成,主线程直接返回进行下一次循环操作,效率大大提升。但是主线程需要完成对所有Socket的监听以及数据读写的工作,当并发请求数较多时,并且发送数据量较多时,监听Socket上新连接请求不能被及时接受。


  • TThreadPoolServer模式采用阻塞Socket方式工作,主线程负责阻塞式监听是否有新Socket到来,业务处理交由一个线程池来处理。线程池模式中,数据读取和业务处理都交由线程池完成,主线程只负责监听新连接,因此在并发量较大时新连接也能够被及时接受。线程池模式比较适合服务器端能预知最多有多少个客户端并发的情况,这时每个请求都能被业务线程池及时处理,性能也非常高。


  • TThreadSelectorServer模式是目前Thrift提供的最高级的模式,内部包括以下几个部分:


  1. 一个AcceptThread线程对象,专门用于处理监听Socket上的新连接;

  2. 若干个SelectorThread对象专门用于处理业务Socket的网络I/O操作,所有网络数据的读写军事由这些线程来完成;

  3. 一个负载均衡器SelectorThreadLoadBalancer对象,主要用于AcceptThread线程接收到一个新Socket连接请求时,决定将这个新连接请求分配给哪个SelectorThread线程。

  4. 一个ExecutorService类型的工作线程池,在SelectorThread线程中,监听到有业务Socket中调用请求过来时,则将请求读取之后,交给ExectorService线程池中的线程完成此次调用的具体执行。


TThreadSelectorServer模式中有一个专门的线程AcceptThread用于处理新连接请求,因此能够及时响应大量并发连接请求;另外它将网络I/O操作分散到多个SelectorThread线程中来完成,因此能够快速对网络I/O进行读写操作,能够很好地应对网络I/O较大的情况。


发个小广告!!!走过路过,不要错过!新书来啦!!!

Thrift服务端的5种工作模式
Thrift服务端的5种工作模式
Thrift服务端的5种工作模式

这里有你想买的书!

http://product.dangdang.com/23949549.html#ddclick_reco_reco_relate

麦克叔叔每晚十点说


以上是关于Thrift服务端的5种工作模式的主要内容,如果未能解决你的问题,请参考以下文章

基于thrift的java和python分别作为客户端和服务端的调用实现

业余草 thrift 内存溢出的分析解决过程分享

记一次内存溢出的分析经历——thrift带给我的痛orz

python thrift 服务端与客户端使用

Thrift第七课 服务器多线程发送异常

VIP_OSP--基于Thrift的RPC框架的基本原理