Thrift採用了TServer来作为server的抽象,提供了多种类型的server实现。用TServerTransport作为server的Acceptor抽象,来监听端口。创建clientSocket连接

先来看看TServerTransport。主要有两类

1. TNonblockingServerTransport和TNonblockingServerSocket作为非堵塞IO的Acceptor,封装了ServerSocketChannel

2. TServerSocket作为堵塞同步IO的Acceptor,封装了ServerSocket

  1. public class TNonblockingServerSocket extends TNonblockingServerTransport {
  2. private ServerSocketChannel serverSocketChannel = null;
  3. }
  4. protected TNonblockingSocket acceptImpl() throws TTransportException {
  5. if (serverSocket_ == null) {
  6. throw new TTransportException(TTransportException.NOT_OPEN, "No underlying server socket.");
  7. }
  8. try {
  9. SocketChannel socketChannel = serverSocketChannel.accept();
  10. if (socketChannel == null) {
  11. return null;
  12. }
  13.  
  14. TNonblockingSocket tsocket = new TNonblockingSocket(socketChannel);
  15. tsocket.setTimeout(clientTimeout_);
  16. return tsocket;
  17. } catch (IOException iox) {
  18. throw new TTransportException(iox);
  19. }
  20. }
  21.  
  22. public void registerSelector(Selector selector) {
  23. try {
  24. // Register the server socket channel, indicating an interest in
  25. // accepting new connections
  26. serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
  27. } catch (ClosedChannelException e) {
  28. // this shouldn't happen, ideally...
  29. // TODO: decide what to do with this.
  30. }
  31. }
  32. public class TServerSocket extends TServerTransport {
  33. private ServerSocket serverSocket_ = null;
  34. }
  35. protected TSocket acceptImpl() throws TTransportException {
  36. if (serverSocket_ == null) {
  37. throw new TTransportException(TTransportException.NOT_OPEN, "No underlying server socket.");
  38. }
  39. try {
  40. Socket result = serverSocket_.accept();
  41. TSocket result2 = new TSocket(result);
  42. result2.setTimeout(clientTimeout_);
  43. return result2;
  44. } catch (IOException iox) {
  45. throw new TTransportException(iox);
  46. }
  47. }

再看TServer的类层次结构。主要也是两类,非堵塞IO和同步IO

非堵塞IO的Server有:

1. TNonblockingServer是单线程的,仅仅有一个SelectAcceptThread线程来轮询IO就绪事件,调用就绪的channel来对应Accept, Read, Write事件。而且还是使用这个线程来同步调用实际的方法实现。


2. THsHaServer是所谓的半同步半异步的server。所谓半同步是说使用一个SelectAcceptThread线程来轮询IO就绪事件,调用就绪的channel来对应Accept, Read, Write事件。所谓的半异步是说方法的调用是封装成一个Runnable交给线程池来运行的,交给线程池立马返回,不同步等待方法运行完成,方法运行完成的写返回是有线程池中的线程来做的,实现了所谓的异步訪问的模式。

3. TThreadSelectorServer,这个server类比較有意思。是多线程Reactor模式的一种实现。

3.1 採用了一个AcceptorThread来专门监听port,处理Accept事件,然后创建SocketChannel。创建完毕之后交给一个线程池来处理兴许动作,将SocketChannel放到SelecotrThread的堵塞队列acceptedQueue中

3.2 採用多个SelectorThread来处理创建好的SocketChannel。每一个SelectorThread绑定一个Selector。这样将SocketChannel分给多个Selector。

同一时候SelectorThread又维护了一个堵塞队列acceptedQueue,从acceptedQueue中拿新创建好的SocketChannel,来注冊读事件



同步的TServer有TThreadPoolServer,关联一个TServerSocket,採用同步IO的方式来Accept,然后交给一个线程池来处理兴许动作

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRlcl9aQw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

这里有一篇老外写的文章比較各种server的性能。https://github.com/m1ch1/mapkeeper/wiki/Thrift-Java-Servers-Compared

结论是TThreadSelectorServer在吞吐量和server响应时间的表现都是最优的

Thrift源代码分析(七)-- TServerserver分析的更多相关文章

  1. Thrift源代码分析(八)--总结加一个完整的可执行的Thrift样例

    前面七篇文章分析了Thrfit的方方面面,看到这里时应该对Thrift有了深入的理解. Thrift源代码分析(一)-- 基本概念 Thrift源代码分析(二)-- 协议和编解码 Thrift源代码分 ...

  2. 手机自动化测试:Appium源码分析之跟踪代码分析七

    手机自动化测试:Appium源码分析之跟踪代码分析七   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  3. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  4. x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. 5W2H方法:七问分析法

    5W2H分析方法也叫七问分析法,是二战中美国陆军兵器修理部首创.简单.方便.易于理解.使用,富有启发意义,被广泛应用于企业管理和技术活动,对于决策和执行性的措施也非常有帮助,有助于弥补考虑问题的疏漏. ...

  6. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  7. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  8. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  9. linux内核中socket的创建过程源码分析(详细分析)

    1三个相关数据结构. 关于socket的创建,首先需要分析socket这个结构体,这是整个的核心. 104 struct socket { 105         socket_state       ...

  10. 安卓脱壳&&协议分析&&burp辅助分析插件编写

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前言 本文以一个 app 为例,演示对 app脱壳,然后分析其 协 ...

随机推荐

  1. POJ 1201 & HDU1384 & ZOJ 1508 Intervals(差分约束+spfa 求最长路径)

    题目链接: POJ:http://poj.org/problem?id=1201 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=1384 ZOJ:htt ...

  2. Gretna2.0 使用过程中遇到的问题

    在做Normalize的时候,报错"Cannot find T1 image (e.g. *.dcm in T1 Directory), Please Check again!", ...

  3. iOS判断一些权限是否被禁止

    iOS中经常会遇到访问相册.相机.麦克疯.蓝牙.以及推送等权限,所以每次我们要使用这些权限是都要记得查看用户是否允许了,如果用户禁止了你的访问权限,你仍然去调取相册或者相机等,那么就会先出现下面的这个 ...

  4. Redis学习笔记(一) 初识 Redis

    简介 我所在的公司是一个以线下业务为主的公司,软件这一块的东西可以说是手工作坊,技术上的东西全靠大家自己折腾.最近也是觉得自己在社会主义的怀抱里安逸了太久,要提高思想政治觉悟,不能忘了资本主义的黑暗, ...

  5. asp.net 后台给前台控件添加及设置属性

    txtTopImgBox.Attributes.Add("title", "12312121"); Text1.Style["background-c ...

  6. struts2学习之基础笔记5

    第十章 Struts 2的输入校验 1 Struts 2 输入校验原理 a . 分类 validate()方法校验 b . validation框架校验 2 valibate()方法校验实现 步骤  ...

  7. hdu 1532 Drainage Ditches 【ISAP 】

    还是不是很懂算法 先存一个模板先吧--- 看的这篇学的-- http://www.renfei.org/blog/isap.html #include<cstdio> #include&l ...

  8. BarTender无法连接到数据库?原来是微软补丁包捣的鬼

    近期有很多BarTender用户反映,在使用BarTender设计打印条码时,经常会出现错误消息6670 的提示,使得BarTender无法连接到数据库,究其原因,原来是微软补丁包捣的鬼.目前海鸥科技 ...

  9. Pyhton学习——Day11

    # Python中的内部模块# 函数学习的意义:抽取重复代码# 模块:不用重复写,模块及py文件,提高了代码的可维护性,其次,编写代码不必从零开始,当一个模块编写完毕,不必再重复编写# import ...

  10. 12、Camel: Content-Aware and Meta-path Augmented Metric Learning for Author Identification----作者识别

    摘自:https://blog.csdn.net/me_yundou/article/details/80459341 具体看上面链接 一.摘要: 这篇文章主要介绍的是作者识别(author iden ...