引言

不同的线程模型对程序的性能有很大的影响,Netty是建立在Reactor模型的基础上,要搞清Netty的线程模型,需要了解一目前常见线程模型的一些概念。

具体是进程还是线程,是和平台或者编程语言相关,本文为了描述方便,以线程描述。

目前存在的线程模型有:

  • 传统阻塞IO服务模型
  • Reactor模型
  • Proactor模型

1、传统阻塞IO服务模型

采用阻塞IO模型获取输入的数据。 每个连接需要独立的完成数据的输入,业务的处理,数据返回。

当并发数大的时候,会创建大量的线程,占用系统资源,如果连接创建后,当前线程没有数据可读,会阻塞,造成线程资源浪费。

2、Reactor模型

IO多路复用 线程池 = Reactor模型

根据Reactor的数量和处理线程的数量,Reactor模型分为三类:

  • 单Reactor单线程
  • 单Reactor多线程
  • 主从Reactor多线程

下面分别描述。

2.1、单Reactor单线程



图中:

  • Reactor中的select模块就是IO多路复用模型中的选择器,可以通过一个阻塞对象监听多路连接请求。
  • Reactor对象通过Select监控客户端请求事件,收到事件后,通过Dispatch进行分发。
  • 如果是建立连接事件,则用Acceptor通过Accept处理连接请求,然后创建一个Handler对象,处理连接完成后的业务处理。
  • 如果不是建立连接事件,则Reactor会分发调用连接对应的Handler处理。
  • Handler会处理Read-业务-Send流程。

这种模型,在客户端数量过多时,会无法支撑。因为只有一个线程,无法发挥多核CPU性能,且Handler处理某个连接的业务时,服务端无法处理其他连接事件。

以前在学习Redis原理的时候,发现它内部就是这种模型:深入了解Redis【十二】Reactor事件模型在Redis中的应用

2.2、单Reactor多线程

图中多线程体现在两个部分:

  • Reactor主线程

    Reactor通过select监听客户请求,如果是连接请求事件,则由Acceptor处理连接,如果是其他请求,则由dispatch找到对应的Handler,这里的Handler只负责响应事件,读取和响应,会将具体的业务处理交由Worker线程池处理。
  • Worker线程池

    Worker线程池会分配独立线程完成真正的业务,并将结果返回给Handler,Handler收到响应后,通过send将结果返回给客户端。

这里Reactor处理所有的事件监听和响应,高并发情景下容易出现性能瓶颈。

2.3、主从Reactor多线程

这种模式是对单Reactor的改进,由原来单Reactor改成了Reactor主线程与Reactor子线程。

  • Reactor主线程的MainReactor对象通过select监听连接事件,收到事件后,通过Acceptor处理连接事件。
  • 当Acceptor处理完连接事件之后,MainReactor将连接分配给SubReactor。
  • SubReactor将连接加入到连接队列进行监听,并创建handler进行事件处理。
  • 当有新的事件发生时,SubReactor就会调用对应的handler处理。
  • handler通过read读取数据,交由Worker线程池处理业务。
  • Worker线程池分配线程处理完数据后,将结果返回给handler。
  • handler收到返回的数据后,通过send将结果返回给客户端。
  • MainReactor可以对应多个SubReactor。

这种优点多多,各个模块各司其职,缺点就是实现复杂。

3、Proactor模型

Proactor模型在理论上是比Reactor模型性能更好,但是因为依赖于操作系统的非阻塞异步模型,而linux的非阻塞异步模型还不完善,所以还是以Reactor为主。

总结

在学习这一部分知识的时候,想到redis中Reactor的应用,又想到了以前分析Tomcat源码时,其内部就是这种Reactor的思想。

突然感觉被我发现了一个天大的秘密:技术原理是通用的!

参考

Netty 系列之 Netty 线程模型

理解高性能网络模型

深入了解Netty【五】线程模型的更多相关文章

  1. Netty IO线程模型学习总结

    Netty框架的 主要线程是IO线程.线程模型的好坏直接决定了系统的吞吐量.并发性和安全性. Netty的线程模型遵循了Reactor的基础线程模型.以下我们先一起看下该模型 Reactor线程模型 ...

  2. Netty Reactor 线程模型笔记

    引用: https://www.cnblogs.com/TomSnail/p/6158249.html https://www.cnblogs.com/heavenhome/articles/6554 ...

  3. Netty服务器线程模型概览

    一切从ServerBootstrap开始 ServerBootstrap负责初始话netty服务器,并且开始监听端口的socket请求. bootstrap bootstrap =newServerB ...

  4. netty之==线程模型

    1.1 netty线程模型本质遵循了Reactor的基础线程模型,所以得先介绍Reactor模型  1.2  Reactor模型 无论是C++还是Java编写的网络框架,大多数都是基于Reactor模 ...

  5. 面试官:Netty的线程模型可不只是主从多Reactor这么简单

    笔者看来Netty的内核主要包括如下图三个部分: 其各个核心模块主要的职责如下: 内存管理 主要提高高效的内存管理,包含内存分配,内存回收. 网通通道 复制网络通信,例如实现对NIO.OIO等底层JA ...

  6. netty reactor线程模型分析

    netty4线程模型 ServerBootstrap http示例 // Configure the server. EventLoopGroup bossGroup = new EpollEvent ...

  7. Netty In Action中文版 - 第十五章:选择正确的线程模型

    http://blog.csdn.net/abc_key/article/details/38419469 本章介绍 线程模型(thread-model) 事件循环(EventLoop) 并发(Con ...

  8. Netty线程模型

    一.Reactor模型 1.单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NI ...

  9. 【Netty源码分析】Reactor线程模型

    1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...

随机推荐

  1. 2017面向对象程序设计(Java)第十三周助教工作总结

    时间飞逝,本学期即将接近尾声.不知不觉同学们已经学习java十三个星期了,想必同学们对Java课程体系及内容有了更加深入的理解,也应该摸索出了一套适用于自己的学习方法. 下面我对上周工作做以简单总结: ...

  2. 用Spark进行实时流计算

    Spark Streaming VS Structured Streaming Spark Streaming是Spark最初的流处理框架,使用了微批的形式来进行流处理. 提供了基于RDDs的Dstr ...

  3. Codechef July Challenge 2020 Division 1 记录

    目录 Missing a Point Chefina and Swaps Doctor Chef Chef and Dragon Dens LCM Constraints Weird Product ...

  4. C#LeetCode刷题之#933-最近的请求次数(Number of Recent Calls)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4134 访问. 写一个 RecentCounter 类来计算最近的 ...

  5. C#LeetCode刷题之#788-旋转数字(Rotated Digits)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3967 访问. 我们称一个数 X 为好数, 如果它的每位数字逐个地 ...

  6. Java中的策略模式,完成一个简单地购物车,两种付款策略实例教程

    策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...

  7. 数据库之Oracle优化技巧(二)

    1.通过内部函数提高 SQL 效率 复杂的 SQL 往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际 工作中是非常有意义的 . 2.使用表的别名(Alias) 当在 SQL 语句中连接 ...

  8. 第三章 kubernetes核心原理

    kubernetes API Server 提供了Kubernetes各类资源对象(如pod,re,service等)的增删改查及watch等Http Rest接口,成为集群内各个功能模块之间数据交互 ...

  9. start-stop-daemon: matching on world-writable pidfile /var/run/redis/redis-server.pid is insecurefailed

    Microsoft Store上 看到最新的Ubuntu 20.04 LTS 已经适配到WSL上了, 于是卸载了老版本 18.04 LTS,安装上了最新版本的. 第一次启动会比较慢,需耐心等待 Ins ...

  10. Spring源码阅读 ------------------- SpringFrameWork 5.2 +IDEA 部署

    Spring作为JAVA学习者的必须学习和熟悉的框架,需要理解Spring的设计原理,核心设计模式,对于理解设计模式,面向对象的深入理解有着深远持久的影响,特此首先要做到本地部署源码开始,下面将介绍如 ...