前言:
  Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文主要讲解Thrift的高性能网络框架模型, 讲解各种网络模型的特点和区别.

Thrift 高性能网络服务模型
1). TServer类层次体系

TSimpleServer/TThreadPoolServer是阻塞服务模型
TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO)

2). TServer抽象类的定义
内部静态类Args的定义, 用于TServer类用于串联软件栈(传输层, 协议层, 处理层)

public abstract class TServer {public static class Args extends AbstractServerArgs<Args> {public Args(TServerTransport transport) {super(transport);}}public static abstract class AbstractServerArgs<T extends AbstractServerArgs<T>> {public AbstractServerArgs(TServerTransport transport);public T processorFactory(TProcessorFactory factory);public T processor(TProcessor processor);public T transportFactory(TTransportFactory factory);public T protocolFactory(TProtocolFactory factory);}
}

TServer类定义的抽象类

public abstract class TServer {public abstract void serve();public void stop();public boolean isServing();public void setServerEventHandler(TServerEventHandler eventHandler);
}

评注:

  抽象函数serve由具体的TServer实例来实现, 而并非所有的服务都需要优雅的退出, 因此stop没有被定义为抽象

3). TSimpleServer
TSimpleServer实现, 正如其名Simple, 其实现非常的简单, 是个单线程阻塞模型, 只适合测试开发使用
抽象的代码可简单描述如下:

// *) server socket进行监听
serverSocket.listen();
while ( isServing() ) {// *) 接受socket链接client = serverSocket.accept();// *) 封装处理器processor = factory.getProcess(client);while ( true ) {// *) 阻塞处理rpc的输入/输出if ( !processor.process(input, output) ) {break;   }   }
}

4). ThreadPoolServer
ThreadPoolServer解决了TSimple不支持并发和多连接的问题, 引入了线程池. 实现的模型是One Thread Per Connection

线程池代码片段:

  private static ExecutorService createDefaultExecutorService(Args args) {SynchronousQueue<Runnable> executorQueue =new SynchronousQueue<Runnable>();return new ThreadPoolExecutor(args.minWorkerThreads,args.maxWorkerThreads,60,TimeUnit.SECONDS,executorQueue);}

评注:
  采用同步队列(SynchronousQueue), 线程池采用能线程数可伸缩的模式.
主线程循环

setServing(true);
while (!stopped_) {try {TTransport client = serverTransport_.accept();WorkerProcess wp = new WorkerProcess(client);executorService_.execute(wp);} catch (TTransportException ttx) {}
}

评注:
  拆分了监听线程(accept)和处理客户端连接的工作线程(worker), 监听线程每接到一个客户端, 就投给线程池去处理. 这种模型能提高并发度, 但并发数取决于线程数, IO依旧阻塞, 从而限制该服务的服务能力.

5). TNonblockingServer
TNonblockingServer采用NIO的模式, 借助Channel/Selector机制, 采用IO事件模型来处理.

private void select() {try {selector.select();   // wait for io events.// process the io events we receivedIterator<SelectionKey> selectedKeys = selector.selectedKeys().iterator();while (!stopped_ && selectedKeys.hasNext()) {SelectionKey key = selectedKeys.next();selectedKeys.remove();if (key.isAcceptable()) {handleAccept(); // deal with accept} else if (key.isReadable()) {handleRead(key); // deal with reads} else if (key.isWritable()) {handleWrite(key); // deal with writes} }} catch (IOException e) {}
}

评注:

  select代码里对accept/read/write等IO事件进行监控和处理, 唯一可惜的这个单线程处理. 当遇到handler里有阻塞的操作时, 会导致整个服务被阻塞住.

6). THsHaServer
鉴于TNonblockingServer的缺点, THsHa引入了线程池去处理, 其模型把读写任务放到线程池去处理.
HsHa是: Half-sync/Half-async的处理模式, Half-aysnc是在处理IO事件上(accept/read/write io), Half-sync用于handler对rpc的同步处理上.

7). TThreadedSelectorServer
TThreadedSelectorServer是最成熟,也是被业界所推崇的RPC服务模型
TThreadedSelectorServer是对以上NonblockingServer的扩充, 其分离了Accept和Read/Write的Selector线程, 同时引入Worker工作线程池. 它也是种Half-sync/Half-async的服务模型.

总结:

  MainReactor就是Accept线程, 用于监听客户端连接, SubReactor采用IO事件线程(多个), 主要负责对所有客户端的IO读写事件进行处理. 而Worker工作线程主要用于处理每个rpc请求的handler回调处理(这部分是同步的).

问题:

  这边提几个小小的问题, 考考读者?
  1). Java NIO中 Selector采用什么方式实现? c++中的select/poll/epool? 如果是epool的话, 采用的是水平触发,还是边缘触发?
  2). 这边非阻塞模型是HsHa, 有没有全异步的模式? 为何通用的模型是采用TThreadedSelectorServer这种模式呢?
  期待你的回答, 也敬请关注后续的文章.

转载于:https://www.cnblogs.com/mumuxinfei/p/3875165.html

Thrift 个人实战--Thrift 网络服务模型相关推荐

  1. [译]多线程网络服务模型

    2019独角兽企业重金招聘Python工程师标准>>> 多线程网络服务模型 /*** 谨献给Yoyo** 原文出处:https://www.toptal.com/software/g ...

  2. Qt项目实战之网络电子白板-安晓辉-专题视频课程

    Qt项目实战之网络电子白板-10082人已学习 课程介绍         本课程使用Qt技术实现了网络电子白板,支持直线.矩形.椭圆.三角形.涂鸦等图形元素.本课程实现的电子白板,可以在多人之间共享, ...

  3. 视频教程-2019视频营销实战教程-网络营销

    2019视频营销实战教程 PTT职业培训师 信息化教学讲师 视频营销讲师 微课创艺研发讲师 百度认证作者 刘启国 ¥19.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 ...

  4. 赛宁谈靶场–面向实战的网络靶场体系

    导 语 赛宁网安聚焦网络安全攻防对抗核心技术,是国际领先的专业网络靶场提供商,产品远销全球二十多个国家."赛宁谈靶场"是赛宁网安结合市场需求,以及自身多年实践积累推出的系列文章,围 ...

  5. Python实战之网络与爬虫篇-----如何查看用户Star了哪些库

    Python实战之网络与爬虫篇-----如何查看用户Star了哪些库 1.问题求解 试着用前面所学的知识查看用户Codingchaozhang 都Starred了哪些库,并且自动在游览器中打开这些库的 ...

  6. flutter 项目实战二 网络请求

    本项目借用 逛丢 网站的部分数据,仅作为 flutter 开发学习之用. 逛丢官方网址:https://guangdiu.com/ flutter windows开发环境设置 flutter 项目实战 ...

  7. tcp网络服务模型,redis,nginx,memcached一起搞定

    1. 网络服务模型 2. 单线程redis网络处理 3. 多线程memcached网络处理 4. 多进程nginx网络处理 视频地址:https://www.bilibili.com/video/BV ...

  8. 实战型网络工程师系列课程

    <实战型网络工程师系列课程>介绍 课程定位:IT职业教育课程 课程组成:视频+辅导+考试+证书 课程简介:赛迪教育(www.ccidedu.com)与金资讯教育在线共同开发<实战型网 ...

  9. 笨办法学Python(第四版)最新版+Python爬虫开发与项目实战+Python网络数据采集+精通Scrapy网络爬虫

    笨办法学Python(第四版)最新版+Python爬虫开发与项目实战+Python网络数据采集+精通Scrapy网络爬虫 本资料为最新整理高清带目录pdf,百度网盘下载~~~ 本资料为最新整理高清带目 ...

最新文章

  1. 用户信息检索另一台服务器,客户机上一用户访问另一台机器上的informix数据库...
  2. linux shell 判断字符串是否为数字
  3. 思路:当一个表嵌套另一个表时候 只需在dao中引入该mapper即可 进行正常的数据插入 查询 修改等...
  4. 转载:网站取得定向流量的三种方式
  5. Mongodb 故障分享 初始化时errmsg : exception: new file allocation failure 并且长时间处于STARTUP2...
  6. 菜鸟学java要多久_菜鸟学java,根本停不下来!
  7. ip打包后如何加入 xilinx_科普!插上USB设备后电脑是怎么识别的呢?
  8. JavaScript function函数种类
  9. AFNnetworking快速教程,官方入门教程译
  10. select系统调用
  11. android支付宝运动修改器,一键修改支付宝运动步数-修改支付宝运动步数工具下载不要root手机版-西西软件下载...
  12. ARCore 使用 SceneForm 框架 —— 三维空间中,通过三个点绘制平面(Plane)
  13. AI新贵「蓦然认知」首秀,这个和百度有点关系的公司要让机器认知世界
  14. C++关键字protected的作用详解
  15. Pale Moon 15.1 发布,苍月浏览器
  16. 安卓车机数字时间屏保
  17. [转]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
  18. 论文笔记2:Combining Lexical, Syntactic, and Semantic Features with Maximum Entropy Models for Extracting
  19. leetcode学习打卡--572. 另一个树的子树(递归,二叉树遍历)
  20. ESP32 连接到免费的公共 MQTT 服务器

热门文章

  1. TextBox只输入数字和event.keyCode的键码值
  2. 安装串口设备驱动时遇到 Windows 无法验证此设备所需的驱动程序的数字签名。最近的硬件或软件更改安装的文件可能未正确签名或已损坏,或者可能是来自未知来源的恶意软件. 问题该如何处理?...
  3. 第十五篇 Python之文件处理
  4. vue联动切换搜索域
  5. 利用virt-manager,xmanager, xshell启动界面来管理虚拟机
  6. drupal 7在一个form新增或者修改一个字段
  7. Android开发学习之路--网络编程之初体验
  8. UNIX网络编程读书笔记:套接口地址结构
  9. 十大非著名之父:手机,黑莓,iPod,FORTRAN,远程办公,鼠标,垃圾邮件,DSL,Java,WIFI说,我爸是...-asp.net关注...
  10. JavaScript Swiper插件