由浅入深了解Thrift(三)——Thrift server端的几种工作模式分析

转载 2015年07月09日 16:05:38

http://blog.csdn.net/houjixin/article/details/42779915


五、  Thrift服务器端几种工作模式分析与总结

Thrift为服务器端提供了多种工作模式,本文中将涉及以下5中工作模式:TSimpleServer、TNonblockingServer、THsHaServer、TThreadPoolServer、TThreadedSelectorServer,这5中工作模式的详细工作原理如下:

1.      TSimpleServer模式

TSimpleServer的工作模式只有一个工作线程,循环监听新请求的到来并完成对请求的处理,它只是在简单的演示时候使用,它的工作方式如图5.1所示:


图5.1 TSimpleServer的工作模式

TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低,主要用于演示Thrift的工作过程,在实际开发过程中很少用到它。

2.      TNonblockingServer模式

TNonblockingServer工作模式,该模式也是单线程工作,但是该模式采用NIO的方式,所有的socket都被注册到selector中,在一个线程中通过seletor循环监控所有的socket,每次selector结束时,处理所有的处于就绪状态的socket,对于有数据到来的socket进行数据读取操作,对于有数据发送的socket则进行数据发送,对于监听socket则产生一个新业务socket并将其注册到selector中,如下图5.2所示:


图5.2、TNonblockingServer工作模式

上图5.2中读取数据之后的业务处理就是根据读取到的调用请求,调用具体函数完成处理,只有完成函数处理才能进行后续的操作;

TNonblockingServer模式优点:

相比于TSimpleServer效率提升主要体现在IO多路复用上,TNonblockingServer采用非阻塞IO,同时监控多个socket的状态变化;

TNonblockingServer模式缺点:

TNonblockingServer模式在业务处理上还是采用单线程顺序来完成,在业务处理比较复杂、耗时的时候,例如某些接口函数需要读取数据库执行时间较长,此时该模式效率也不高,因为多个调用请求任务依然是顺序一个接一个执行。

3.      THsHaServer模式(半同步半异步)

THsHaServer类是TNonblockingServer类的子类,在5.2节中的TNonblockingServer模式中,采用一个线程来完成对所有socket的监听和业务处理,造成了效率的低下,THsHaServer模式的引入则是部分解决了这些问题。THsHaServer模式中,引入一个线程池来专门进行业务处理,如下图5.3所示;


图5.3 THsHaServer模式

THsHaServer的优点:

与TNonblockingServer模式相比,THsHaServer在完成数据读取之后,将业务处理过程交由一个线程池来完成,主线程直接返回进行下一次循环操作,效率大大提升;

THsHaServer的缺点:

由图5.3可以看出,主线程需要完成对所有socket的监听以及数据读写的工作,当并发请求数较大时,且发送数据量较多时,监听socket上新连接请求不能被及时接受。

4.      TThreadPoolServer模式

TThreadPoolServer模式采用阻塞socket方式工作,,主线程负责阻塞式监听“监听socket”中是否有新socket到来,业务处理交由一个线程池来处理,如下图5.4所示:


图5.4 线程池模式工作过程

TThreadPoolServer模式优点:

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

TThreadPoolServer模式缺点:

线程池模式的处理能力受限于线程池的工作能力,当并发请求数大于线程池中的线程数时,新请求也只能排队等待。

5.      TThreadedSelectorServer

TThreadedSelectorServer模式是目前Thrift提供的最高级的模式,它内部有如果几个部分构成:

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

(2)  若干个SelectorThread对象专门用于处理业务socket的网络I/O操作,所有网络数据的读写均是有这些线程来完成;

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

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


图5.5 TThreadedSelectorServer模式的工作过程

如上图5.5所示,TThreadedSelectorServer模式中有一个专门的线程AcceptThread用于处理新连接请求,因此能够及时响应大量并发连接请求;另外它将网络I/O操作分散到多个SelectorThread线程中来完成,因此能够快速对网络I/O进行读写操作,能够很好地应对网络I/O较多的情况;TThreadedSelectorServer对于大部分应用场景性能都不会差,因此,如果实在不知道选择哪种工作模式,使用TThreadedSelectorServer就可以。



相关文章推荐

sparkSQL1.1入门之七:ThriftServer和CLI

spark1.1相较于spark1.0,最大的差别就在于spark1.1增加了万人期待的CLI和ThriftServer。使得hive用户还有用惯了命令行的RDBMS数据库管理员很容易地上手spark...

Thrift Server介绍及代码实现

摘要:本文介绍Thrift几个Server,以及其代码的实现。

Java版的各种Thrift server实现的比较

(转载文章,点击查看原文http://www.codelast.com/) 本文是我对这篇文章的翻译:Thrift Java Servers Compared,为了便于阅读,我将原文附于此处...
  • azhao_dn
  • azhao_dn
  • 2013年05月08日 09:32
  • 15588

记一次Thrift Server错误排查

1. 起因1.1. 昨夜下班回家后11点左右突然收到hbase监控的连接失败邮件。1.2. 上线查看监控日志,发现均是timeout异常1.3. 查看消费者日志,发现所有连接不可用,不断重试中,遂关闭...
  • sheep_3
  • sheep_3
  • 2017年02月21日 11:31
  • 1676

hbase的thriftserver开启

要使用Hbase的thrift接口,必须将它的服务启动,命令行为: hbase-deamon.sh start thrift2 thrift默认的监听端口是9090,可以用netstat -nl | ...

分布式sparkSQL引擎应用:从远程通过thriftServer连接spark集群处理hive中的数据

实现原理: 客户端(java程序)与thriftServer连接,thriftServer再代理客户端转换成spark的操作流程,实现远程加载hive的数据到spark的work节点,并运行Map-R...

各种thrift server的对比

转载文章 来自   http://blog.csdn.net/azhao_dn/article/details/8898610 以下来自其他文章的转载,主要讲述不同的thrift server的区别,...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

thrift三种server方式说明

SimpleServer:单线程,每个线程阻塞 ThreadServer:多线程,来一个连接开一个线程,线程阻塞。 ThreadPoolServer:线程池,每个线程阻塞 ...

RPC 工具 --Thrift(二) Thrift 异步模式

Thrift异步模式我们广泛使用thrift作为我们内部接口调用的RPC框架,而且基本上都是使用多线程请求等待应答的同步模式 。但是在一些情况下(例如大数据量同步),如果可以使用异步模式,可以优化程序...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:由浅入深了解Thrift(三)——Thrift server端的几种工作模式分析
举报原因:
原因补充:

(最多只允许输入30个字)