Netty线程模型详解

news2024/10/6 6:52:47

文章目录

    • 概述
    • 单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.coloradmin.cn/o/1514730.html

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

相关文章

1、计划任务介绍

Windows计划任务介绍 1、含义: 简单点就是定时执行任务。 在许多场景下,我们定时执行一些任务。比如:定时拉取、备份文件,更新代码等等操作。 WinR打开运行框,输入:control schedtasks,就会…

SAR ADC系列4——比较器的Transient noise仿真--等效输入噪声

仿真出等效输入噪声 加一个快于实际工作的时钟频率;在输入端加一个DC的差(比如一端是0.5VDD,另外一端加0.5VDD0.2MV)计算仿真时间内的correct counting number,比如时钟频率是200MHz,仿真时间是5us,那么应…

IMX8MM -- Yocto构建遇见的错误及解决方法:

IMX8MM Yocto构建遇见的错误及解决方法: 1 bison-3.0.4 error2 Opencv BB_NO_NETWORK Error :3 Yocto构建时出现U-boot 问题4 Yocto构建时出现Linux kernel编译问题5 wayland-native6 cross-localedef-native7 wayland-protocols8 mesa 硬件:…

[论文精读]Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection

论文网址:[2304.08876] 用于定向微小目标检测的动态粗到细学习 (arxiv.org) 论文代码:https://github.com/ChaselTsui/mmrotate-dcfl 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&…

android MMKV数据持久化缓存集合

前言 最近在使用mmkv缓存的时候 发现没有集合缓存 非常不方便 自己写一个方法 MMKV public class MmkvUtils {private MmkvUtils() {throw new UnsupportedOperationException("u cant instantiate me...");}public static void init() {MMKV.initialize(LeoUtils…

C语言从入门到熟悉------第三阶段

数组 什么是数组呢?顾名思义数组就是很多数的组合!那么这些数有没有什么要求呢?是不是不管什么数组合在一起都是数组呢?第一,这些数的类型必须相同!第二,这些数在内存中必须是连续存储的。也就…

力扣思路题:重复的子字符串

注意比较j与j-i是否相同 bool repeatedSubstringPattern(char* s) {int i;int nstrlen(s);bool flag;for(int i1;i<n/2;i){if(n%i0){flagtrue;}for(int ji;j<n;j){if(s[j]!s[j-i]){flagfalse;break;}}if(flagtrue){return true;}}return false; }

Python爬虫基础学习-互联网、HTTP与HTML

互联网或者叫国际网&#xff08;Internet&#xff09;&#xff0c;是指网络与网络之间所串连成的庞大网络&#xff0c;这些网络以一组标准的网络TCP/IP协议族相连&#xff0c;连接全世界几十亿个设备&#xff0c;形成逻辑上的单一巨大国际网络。它是由从地方到全球范围内几百万…

【算法】一类支持向量机OC-SVM(2)

【算法】一类支持向量机OC-SVM&#xff08;2&#xff09; 前言纠正内容数据集创建方式适应度函数 新增内容散点图示例模型散点图展示 前言 在上则博文【算法】一类支持向量机OC-SVM&#xff08;1&#xff09; 中&#xff0c;我们提及到了蜂群算法优化一类支持向量机超参数模型…

gpt-4-all模型中转实现

最近才完成这个功能&#xff0c;相信知道这个模型的人&#xff0c;应该已经熟悉了。这是我的中转&#xff1a;openai-api Chatbox配置如下&#xff1a; 模型测试&#xff1a; 1&#xff09;图片生成 2&#xff09;文件分析&#xff0c;链接读取&#xff1a;

WWW2024 | PromptMM:Prompt-Tuning增强的知识蒸馏助力多模态推荐系统

论文&#xff1a;https://arxiv.org/html/2402.17188v1 代码&#xff1a;https://github.com/HKUDS/PromptMM 研究动机 多模态推荐系统极大的便利了人们的生活,比如亚马逊和Netflix都是基于多模态内容进行推荐的。对于研究,人们也遵循工业界的趋势,进行modality-aware的用户…

初步了解序列化和反序列化

01什么是序列化和反序列化 序列化是将对象转化为字符串以便存储的一种方式。而反序列化恰好是序列化的逆过程&#xff0c;反序列化会将字符串转化为对象供程序使用。 常见的php系列化和反系列化方式主要有&#xff1a;serialize&#xff0c;unserialize&#xff1b;json_enco…

删除元素.

C 用迭代器迭代&#xff0c;当条件成立删除元素。 class Solution { public:int removeElement(vector<int>& nums, int val) {for(std::vector<int>::iterator itnums.begin();it!nums.end();){if(*itval){itnums.erase(it);//vector删除时迭代器会失效&…

jenkins 使用k8s插件连接k8s集群

jenkins 安装k8s 插件 配置k8s节点 填写k8s 配置信息 生成秘钥 在服务器上面 查看地址 Kubernetes 服务证书 key cat /root/..kube/config 查看秘钥 对秘钥进行base64 位 加密 echo "秘钥内容" | base64 -d -----BEGIN CERTIFICATE----- MIIDITCCAgmgAwIB…

第一位 AI 程序员诞生,队友还是对手?

前几天&#xff0c;百度创始人李彦宏在采访中声称&#xff1a;“以后不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力”。 看到这话我的第一反应是“不可能&#xff0c;绝对不可能&#xff0c;程序员的工作有很大一部分是创造性的…

顺序表后续以及通讯录项目

⽬录 1. 基于动态顺序表实现通讯录项⽬ 2. 顺序表经典算法 3. 顺序表的问题及思考 正⽂开始 继上一篇 1.动态顺序表的查找 这里挺简单的如找不到就返回一个负数&#xff0c;因为索引不可能是负的这里就用来代表找不到 下面是找不到的示例 最终代码可以优化成这样 2.动态…

2024-03-13 作业

网络编程&#xff1a; 1.思维导图&#xff1a; 2.上课写的代码&#xff1a; 2.1网络字节序与主机字节序转换 运行代码&#xff1a; #include <myhead.h> int main() {int num 0x12345678;short int value 0x1234;int num_n htonl(num);int value_n htons(value);…

Window API 使用的一些注意事项

文章目录 1、LPCWSTR类型2、LPCTSTR类型3、LPCSTR类型4、LPCTSTR和LPCWSTR区别5、LPCTSTR和LPCSTR、LPCWSTR三者区别6、_T(" ")7、DWORD类型转换为std::wstring类型8、char类型转换为LPCSTR类型9、获取当前时间戳(毫秒)10、std::wstring和LPCSTR区别11、std::wstring…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Toggle)

组件提供勾选框样式、状态按钮样式及开关样式。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 仅当ToggleType为Button时可包含子组件。 接口 Toggle(options: { type: ToggleType, is…

android studio 连接mumu模拟器调试

1、打开mumu模拟器 2、在Android Studio 中 控制台 cd 到 sdk 目录下 platform-tools 文件夹&#xff0c;有一个adb.exe 可运行程序 一般指令&#xff1a; adb connect 127.0.0.1:7555 但是这个执行在window环境下可能会报错 解决方法是在 adb 之前加 ".\", 问题…