Netty实战与源码剖析(二)——Netty线程模型

news2024/11/17 12:53:11

1 线程模型基本介绍

不同的线程模式,对于程序的性能有很大的影响,Netty为何具有如此高的性能,很大程度上是得益于Netty采用的线程模型。

目前主流存在的线程模型有两种:

  • 传统阻塞IO模型
  • Reactor模型

然而根据Reactor的数量和处理资源线程的数量不同,又可以将Reactor模型分为三种:

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

Netty基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor。

1.1 传统阻塞IO模型

工作原理图:

模型特点:

  • 采用阻塞IO模式获取输入的数据
  • 每个连接都要独立的线程来完成数据的输入、业务处理、数据的输出返回

问题分析:

  • 当并发度很大,就会创建大量的线程,占用很大的系统开销
  • 当连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源的浪费

解决方案:

  • 基于IO复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有数据可用时,操作系统通知应用程序,线程从阻塞状态返回,处理业务逻辑。
  • 基于线程池复用线程资源:不必再为每个连接创建一个线程,将连接完成后的业务处理交给线程,这样可以使得线程池中的每一个线程都可以处理多个连接的业务逻辑。

1.2 Reactor模式

上述说的IO复用模型结合线程池机制,就形成了Reactor模式。

工作原理图:

模型特点:

  • Reactor模式是通过一个或多个输入同时传递给服务处理器的模式,基于事件驱动
  • 服务端程序处理连接的多个请求,并把请求分派给相应的处理线程,故Reactor模式也叫Dispatcher模式
  • Reactor模式使用IO复用模型,监听事件,收到事件后,分发给某个线程或进程,这也是网络服务器高并发处理的关键

核心组件:

  • Reactor:其实就是上图中的ServiceHandler
  • Handler:其实就是上图中处理线程的EventHandler

1.3 单Reactor单线程模式

前面的博客中,Java NIO编程其实就是一种单Reactor单线程,Selector相当于Reactor,得到SelectKey后的操作其实就是在一个线程中完成的,这就是一个Handler。

  • 优点:模型简单,无多线程、线程通信、上下文切换、锁竞争等问题
  • 缺点
    • 性能低,只用了一个线程,无法完全发挥多核CPU的性能
    • 可用性低,线程若意外终止,或进入死循环,导致整个通信模块不可用
  • 使用场景:客户端数量有限,业务处理快速等

1.4 单Reactor多线程模式

和单Reactor单线程模式比较类似,不同的地方在于,当Reactor收到事件,如果是连接事件,则交给一个特定的线程处理连接后的业务;如果不是连接时间,则由Reactor分发到不同的Handler,但Handler只负责相应事件,不做具体的业务处理,只是通过read读取数据后,交给worker线程池进行处理业务,worker线程池会分配一个线程来处理业务,并将结果返回给Handler,Handler再返回结果给客户端。

  • 优点:充分利用多核CPU的处理能力
  • 缺点
    • 多线程数据共享和访问较为复杂,线程安全问题;
    • Reactor是单线程中运行的,处理所有的事件监听和相应,高并发下有性能瓶颈

1.5 主从Reactor多线程模式

Reactor主线程MainReactor对象通过select监听连接事件,收到连接事件后,则交给一个特定的线程处理连接后的业务;如果是其他事件,MainReactor会将事件分配给从线程的SubReactor对象,然后SubReactor将事件分发到不同的Handler,但Handler只负责相应事件,不做具体的业务处理,只是通过read读取数据后,交给worker线程池进行处理业务,worker线程池会分配一个线程来处理业务,并将结果返回给Handler,Handler再返回结果给客户端。

  • 优点:父线程与子线程的数据交互简单,职责明确,父线程只需要接受新连接,子线程则完成后续的业务逻辑处理;父子线程数据交互简单,主线程只需要把非连接的事件传递给子线程,子线程无需返回数据
  • 缺点:复杂度高
  • 这种模型在许多项目中广泛使用,包括Nginx主从Reactor多进程模型,Memcached主从多线程,Netty主从多线程模型的支持。

2 Netty线程模型

如同所示:

  1. Netty 抽象出两组线程池:BossGroup 和 WorkerGroup,也可以叫做 BossNioEventLoopGroup 和 WorkerNioEventLoopGroup。每个线程池中都有 NioEventLoop 线程。BossGroup 中的线程专门负责和客户端建立连接,WorkerGroup 中的线程专门负责处理连接上的读写。BossGroup 和 WorkerGroup 的类型都是 NioEventLoopGroup。

  2. NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每个事件循环就是一个 NioEventLoop。

  3. NioEventLoop 表示一个不断循环的执行事件处理的线程,每个 NioEventLoop 都包含一个 Selector,用于监听注册在其上的 Socket 网络连接(Channel)。

  4. NioEventLoopGroup 可以含有多个线程,即可以含有多个 NioEventLoop。

  5. 每个 BossNioEventLoop 中循环执行以下三个步骤:

    • select:轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
    • processSelectedKeys:处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到某个 WorkerNioEventLoop 上的 Selector 上
    • runAllTasks:再去以此循环处理任务队列中的其他任务
  6. 每个 WorkerNioEventLoop 中循环执行以下三个步骤:

    • select:轮训注册在其上的 NioSocketChannel 的 read/write 事件(OP_READ/OP_WRITE 事件)
    • processSelectedKeys:在对应的 NioSocketChannel 上处理 read/write 事件
    • runAllTasks:再去以此循环处理任务队列中的其他任务
  7. 在以上两个processSelectedKeys步骤中,会使用 Pipeline(管道),Pipeline 中引用了 Channel,即通过 Pipeline 可以获取到对应的 Channel,Pipeline 中维护了很多的处理器(拦截处理器、过滤处理器、自定义处理器等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础转行程序员,有哪些经验可以借鉴?

随着互联网行业的迅速发展,市场对于程序员的需求增大,越来越多的人开始转行到IT领域,程序员也不再基于计算机科学或软件工程等个别专业的毕业生,其他非计算机相关专业的,像学物理、数学、自动化,甚至英语、…

云原生丨DataX在数据迁移中的应用与实践

文章目录一、前言二、准备工作三、安装工具与数据迁移Demo安装工具与数据迁移三、使用Datax抽取移动云上的gauss数据库四、Datax工具逻辑说明整体框架核心模板介绍流程调度数据库类型插件读、写说明五、Datax工具参数说明SettingReader& writerjdbcUrlusernamepasswordtabl…

数据人PK也无人,为什么业务部门的数据需求都是急活?

**导读:**你是不是经常听到数据开发吐槽业务部门:我可以理解业务部门数据需求多,但为什么经常要得这么急呢? 作为一个数据开发者,可以回想一下,当初是怎么进入数据行业的。 是不是也是听一些大V忽悠&…

Java Swing JSlider:滑块组件

在前面的章节中,我们介绍了 Swing 设计简单界面所需的窗口、布局组件以及如何响应事件。Swing 还提供了很多高级组件,如菜单栏、工具栏、文件选择器、表格以及树等。使用这些高级组件可以实现更为复杂的布局,也可以使程序界面更加人性化&…

颜色分析.

介绍 宽光谱光源对许多光学系统都很重要,应用范围包括白光照明、分光计等。Fred中的颜色图像分析,是通过计算每个像素的色度坐标并在表面上显示生成的RGB值来生成颜色分布。此外,FRED还可以显示彩色色度图,并在用户移动光标时指…

CSS -- CSS选择器精讲(基础选择器,符合选择器,属性选择器,结构伪类选择器,伪选择器)

文章目录1 CSS基础选择器1.1 选择器的分类1.2 标签选择器1.3 类选择器1.4 id选择器1.5 通配符选择器1.6 基础选择器总结2 CSS的复合选择器2.1 什么是复合选择器2.2 后代选择器2.3 子选择器2.4 并集选择器2.5 伪类选择器2.6 链接伪类选择器2.7 :focus 伪类选择器2.8 复合选择器总…

正点原子-Linux嵌入式开发学习-第二期04

第十一讲:BSP工程管理 BSP管理其实就是以前学stm32一样的单独为led写.h和.c,并且文件夹有很多种 使用ubuntu的vscode创建bsp文件 第一步:新建bsp文件夹,在bsp文件夹新建各个外设或者功能的文件夹(一定是在相应的文件夹…

nodejs+vue+elementui鲜花销售商城管理系统410

前台: (1) 用户注册:用户名,密码,确认密码,邮箱,手机号,真实姓名,收货地址 (2) 用户登录:用户名,密码,验证码 登录后在主页显示欢迎信息&am…

2022年保险行业和产品研究报告

第一章 行业概况 保险业是经营风险的特殊行业。保险是以契约形式确立双方经济关系,以缴纳保险费建立起来的保险基金,对保险合同规定范围内的灾害事故所造成的损失,进行经济补偿或给付的一种经济形式。 保险是专门以风险为经营对象、为人们提…

RK3568开发环境搭建

前面我给大家展示了RK3568的开发板,但是并没有对RK3568的芯片资源进行描述,这里简单给大家看下该芯片的资源,具体的请看瑞芯微官网https://www.rock-chips.com/ 对芯片有了写了解之后,下面就开始搭建开发环境,让我们早…

Databend 开源周报 #72

Databend 是一款强大的云数仓。专为弹性和高效设计,自由且开源。 即刻体验云服务:https://app.databend.com。 What’s New 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Features & Improvements Multiple Catalogs …

操作系统:虚拟存储器 练习题(带有答案和解析)

文章目录1.虚拟存储器概述1.1.常规存储管理方式的特征和局部性原理1.2.虚拟存储器的定义和特征1.3.虚拟存储器的实现方法2.请求分页存储管理方式2.1.请求分页中的硬件支持2.2.请求分页中的内存分配3.页面置换算法3.1.最佳置换算法和先进先出置换算法3.2.最近最久未使用和最少使…

Spring事件处理

在实际业务开发中,有时候复杂性的业务之间需要解耦,常用的方法:同步、异步、MQ。但 MQ 重啊,非必要不提升架构复杂度。 针对同步和异步使用方式:1.定时器 2.Spring Event. Spring Event: 观察者…

网站反爬指南:政府网站篇

目录 前言 黑灰产为何盯上政务网站? 如何反爬? 前言 网络爬虫正在成为政务网站们最大的威胁之一。 随着网络安全被提升到国家层面,网站安全管理和防护日趋重要,政务网站既要确保网站信息的及时和准确,又要能应对网络…

15. Spring事务管理

1. Spring事务简介 事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或**业务层**保障一系列的数据库操作同成功同失败 2. 案例 2.1 需求和分析 需求:实现任意两个账户间转账操作需求微缩:A账户减…

如何使用 SAP OData 服务向 ABAP 服务器上传文件试读版

本教程到目前为止开发的 OData 图书管理服务,可以在 ABAP 系统里对图书数据进行增删改查。 本步骤我们继续介绍如何通过 SAP OData 服务,实现向 ABAP 系统上传文件的需求。我们采取 Postman 进行文件上传。 先看一下通过本文介绍的步骤,实现…

word基础功能应用:带圈字符如此妙法,好玩有趣

很多人把Word当成码字的记事本,其实它的逆天操作,远比你想象得还要强大。比如,Word中的“带圈字符”功能。 01、基本用法 Word中,点击【开始】-【带圈字符】按钮,即可启用“带圈字符”功能。 比如,我们可…

自然语言处理学习笔记-lecture10-机器翻译01

机器翻译的产生与发展 机器翻译 (machine translation, MT) 是用计算机把一种语言(源语言, source language) 翻译成另一种语言(目标语言, target language) 的一门学科和技术。 机器翻译的困难如下: 自然语言中普遍存在的歧义和未知现象机器翻译不仅仅是字符串的…

Spring IOC和Bean生命周期以及源码分析

这篇文章主要讲解 IOC 容器的创建过程,让大家对整体有一个全局的认识,文章目录如图: 1. 基础知识 1.1 什么是 Spring IOC ? IOC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦…

springboot小区物业管理系统maven idea1562

本小区物业管理系统以springboot作为框架,以MySql作为后台运行的数据库,使用Tomcat用为系统的服务器,同时使用JSP显示业主界面。本系统主要包括以下功能模块:个人中心、业主管理、费用缴纳管理、疫情防控管理、小区车位管理、车位…