Netty线程模型详解

文章目录

    • 概述
    • 单Reactor单线程模型
    • 单Reactor多线程模型
    • 主从Reactor多线程模型

概述

Netty的线程模型采用了Reactor模式,即一个或多个EventLoop轮询各自的任务队列,当发现有任务时,就处理它们。Netty支持单线程模型、多线程模型和混合线程模型等多种线程模型。
Reactor其实是在NIO多路复用的基础上提出的一个高性能IO设计模式。
它的核心思想是把响应IO事件和业务处理进行分离,通过一个或者多个线程来处理IO事件。
然后把就绪的事件分发给业务线程进行异步处理。
Reactor模型有三个重要的组件:
Reactor :把I/O事件分发给对应的Handler
Acceptor :处理客户端连接请求
Handlers :执行非阻塞读/写,也就是针对收到的消息进行业务处理。
在Reactor的这种设计中,有三种模型分别是
单Reactor单线程模型
单Reactor多线程模型
主从Reactor多线程模型

单Reactor单线程模型

就是由同一个线程来负责处理IO事件以及业务逻辑。
这种方式的缺点在于handler的执行过程是串行,如果有任何一个handler处理线程阻塞,就会影响整个服务的吞吐量。
理论上一个NIO线程,既能够接收客户端的链接,同时也能够处理IO操作以及其他任务操作等等,但是一个线程对cpu利用率不高,并且,一旦有大量的请求连接,性能上势必会下降,甚至无法响应的情况.
在这里插入图片描述

单Reactor多线程模型

也就是把处理IO就绪事件的线程和处理Handler业务逻辑的线程进行分离,每个Handler由一个独立线程来处理,在这种设计下,即便是存在Handler线程阻塞问题,也不会对IO线程造成影响。
在多线程Reactor模型下,所有的IO操作都是由一个Reactor来完成的,而且Reactor运行在单个线程里面。对于并发较高的场景下,Reactor就成为了性能瓶颈,所以在这个基础上做了更进一步优化。
1个线程负责专门接收客户端的链接,另一组线程负责处理IO操作或者其他的任务操作.虽然如此,但理论上来说依然有一个地方是单点的;那就是处理客户端连接的线程。
因为大多数服务端应用或多或少在连接时都会处理一些业务,如鉴权之类的,当连接的客户端越来越多时这一个线程依然会存在性能问题。
在这里插入图片描述

主从Reactor多线程模型

提出了多Reactor多线程模型,这种模式也叫Master-Workers模式。
它把原本单个Reactor拆分成了Main Reactor和多个SubReactor,Main Reactor负责接收客户端的
链接,然后把接收到的连接请求随机分配到多个subReactor里面。SubReactor负责IO事件的处理。
这种方式另外一个好处就是可以对subReactor做灵活扩展,从而适应不同的并发量,解决了单个Reactor模式的性能瓶颈问题。
Reactor模型的设计比较常见,比如Spring里面的Webflux就用了这种设计。
并且像Master-Worker模型,在Memcached和Nginx中都有用到。
所以我们其实可以去理解并学习这种设计思想,也许在某些业务场景中可以帮助我们多提供一个解决思路。
Main Reactor:负责接收客户端的连接请求,并将具体的业务IO处理请求转发给 Sub Reactor(其中Sub Reactor可以有多个)。
Acceptor:请求接收者,它的职责类似服务器,并不真正负责连接请求的建立,而只将其请求委托 Main Reactor 线程池来实现,起到一个转发的作用。
Sub Reactor:负责数据的读写,在 NIO 中 通常注册通道的读事件(OP_READ)和写事件(OP_WRITE)。
一个NIO线程池处理链接监听,一个线程池处理IO操作,并且在netty官方中,强烈推荐使用这种线程模型.

Netty有两组线程池,
一个Boss Group,它专门负责客户端连接,另一个Work Group,专门负责网络读写;
Boss Group和Work Group的类型都是NIOEventLoopGroup;NIOEventLoopGroup相当于一个事件循环组,这个组包含了多个事件循环,每一个循环都NIOEventLoop;NIOEventLoop表示一个不断循环执行处理任务的线程,每个NIOEventLoop都有一个Selector,用于监听绑定在其上的ocketChannel的网络通讯;Boss Group下的每个NIOEventLoop的执行步骤有3步:(1). 轮询accept连接事件;(2). 处理accept事件,与client建立连接,生成一个NioSocketChannel,并将其注册到某个work group下的NioEventLoop的selector上;(3). 处理任务队列的任务,
即runAllTasks每个Work Group下的NioEventLoop循环执行以下步骤:(1). 轮询read、write事件;(2). 处理read、write事件,在对应的NioSocketChannel处理;(3). 处理任务队列的任务,即runAllTasks;每个Work Group下的NioEventLoop在处理NioSocketChannel业务时,会使用pipeline(管道),管道中维护了很多 handler 处理器用来处理 channel 中的数据。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法(结合算法图解)

算法简介简单查找二分查找法 选择排序内存的工作原理数组和链表数组选择排序小结 递归小梗 要想学会递归,首先要学会递归。 递归的基线条件和递归条件递归和栈小结 快速排序分而治之快速排序合并排序时间复杂度的平均情况和最糟情况小结 散列表散列函数缓冲小结性能…

不容易系列之(3)—— LELE的RPG难题 Java

题解:假设要涂n1个图案 1.第n个与第一个颜色不一样,第n1个则要与第一个和第n个都不一样,所以只有一种选择 f(n1)f(n) 2.第n个与第一个颜色一样,则第n1个有两种选择 而此时反过去看第n-1个的选择,第一个和第n个都要…

读西游记第一回:西游记世界格局

天地之数: 元:十二万九千六百岁(129600年) 1元12会:子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期:前5400年混沌期,后5400年,盘古开天辟地&am…

NVMFS5A160PLZT1G汽车级功率MOSFET P沟道60 V 15A 满足AEC-Q101标准

关于汽车电子AEC Q101车规认证? 是一种针对分立半导体的可靠性测试认证程序,由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性、温度循环和湿度变化等…

这是一份简单到没朋友的上手图数据库的图文教程

前几天和社区小伙伴友好交流(闲聊),不少加入 NebulaGraph 的小伙伴虽然对图感兴趣,但是因为业务调整或者是时间缘故,最终没能用上 NebulaGraph。而他们当中不少的小伙伴说,春节我打算好好学习一番。既然大家…

vue-cli + vue3.0创建的项目,打包后白屏

一、首先先确认下打包后路径是否正确 publicPath: process.env.NODE_ENV ‘production’ ? ‘./’ : ‘/’, vue2.0 是 baseUrl vue3.0 换成了 publicPath 如果上面配置是正确的,我们再继续查找别的原因 二、检查是否使用了 Vue Router history 模式。 如果使用…

小型校园网配置笔记

1&#xff0c;搭建网络拓扑图 LSW1:三层交换机命令&#xff1a; <Huawei>sys [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]vlan batch 10 20 30 40 100 101 [Huawei]int vlan 10 [Huawei-Vlanif10]ip add 192.168.10.254 24 …

代码随想录(单调栈2)| 503.下一个更大元素II 42. 接雨水

503.下一个更大元素II 这道题和 739. 每日温度 几乎如出一辙&#xff0c;可以自己尝试做一做 leetcode题目链接 文章讲解 本题就是一个环形的下一个元素 形成一个只有一圈的环的方法 循环的长度是vector长度的两倍&#xff0c;获取值的时候通过nums[i % nums.size()] cla…

Stable-Diffusion的WebUI部署实战

1、环境准备及安装 1.1、linux环境 # 首先&#xff0c;已经预先安装好了anaconda&#xff0c;在这里新建一个环境 conda create -n sdwebui python3.10 # 安装完毕后&#xff0c;激活该环境 conda activate sdwebui# 安装 # 下载stable-diffusion-webui代码 apt install wget…

Vue3 前端生成随机id( 生成 UUID )

效果展示 封装工具&#xff08;代码展示&#xff09; 重新创建一个文件**/utils/someTools.js**&#xff0c;并在里面写入如下代码。 function Tools() {}Tools.prototype.guid function () {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, function (c) {v…

Java基于微信小程序的校园生活互助小助手

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【计算机视觉】目标跟踪| 光流算法详细介绍|附代码

0、前言 在上篇文章中https://blog.csdn.net/Yaoyao2024/article/details/136625461?spm1001.2014.3001.5501&#xff0c;我们对目标跟踪任务和目标跟踪算法有了大致的了解。今天我们就来详细介绍一下其中的生成式算法的一种&#xff1a;光流法。 在介绍光流法之前&#xff…