灵魂一击!Netty系列笔记之Reactor模式(建议收藏)
lipiwang 2024-11-26 06:04 7 浏览 0 评论
一、什么是 Reactor
三种 IO 模式和对应的开发模式如下:
BIONIOAIOThread-Per-ConnectionReactorProactor
Reactor 是一种开发模式,核心流程为:
1、注册感兴趣的事件
2、扫描是否有感兴趣的事件发生
3、事件发生后做相应的处理
简言之,注册事件(register)、扫描事件(select)、分发事件(dispatch)、处理事件(handle)。
? 我们发现 Reactor 整个模式从始至终都围绕着事件,下面表格对应了 Netty 中不同的 Channel 监听的事件。
client/serverSocketChannel/ServerSocketChannelOP_ACCEPTOP_CONNECTOP_READOP_WRITEclientSocketChannelYYYserverServerSocketChannelYserverSocketChannelYY
- 对于面向客户端的 SocketChannel 会监听连接、读、写三种事件。
- 对于面向服务端的 ServerSocketChannel 只监听接收新连接的事件,会调用 accept() 方法并创建对应的 SocketChannel 。
- 对于面向服务端的 SocketChannel ,即上面说的创建的子 Channel ,会监听读、写事件。
上面这些事件注册完成后,会有一个多路复用器一直扫描,在监听到这些事件后,Netty 会作相应的处理。
二、Reactor 三种版本
在网络编程中,如果每个客户端都与服务器保持一个连接,对于服务器来说是一个很大的压力。比如 BIO ,也就是上面表格的单线程模式:
上面的三个客户端与服务端之间有三个链接,对于每个链接都有一个 Handler 处理相应的事件:读,解码,计算,编码,响应,也就是占用了三个线程。而其中的读和响应都是阻塞线程的,这时一个严重的问题就出现了,阻塞的连接越多,占用的线程越多。
这种方式,抽象成代码就是:
我们来看 Reactor 如何解决上述出现的问题。
1、Reactor 单线程模式
单线程比较简单,所有的工作都由一个线程来做,包括接收连接、注册事件、扫描、分发、处理等。虽然解决了阻塞问题,但是单线程效率不高,一旦这个线程挂掉,整个系统就 game over 了,这是不能忍受的。
2、Reactor 多线程模式
为了解决单线程的问题,我们引入了线程池。在这个模式中,把比较耗时的 decode、compute、encode 操作交给线程池来做。与单线程模式对比,效率明显提升。
3、主从 Reactor 多线程模式
在上一版本的基础上,使用主从模式,新增主 Reactor 单独处理接收连接,然后将建立的 SocketChannel 注册给指定的从 Reactor。
三、在 Netty 中使用 Reactor 模式
在不指定线程数时,会根据 CPU 的核数来计算最优线程数。第三种主从模式,bossGroup 负责接收连接并将 SocketChannel 注册到 workGroup 上,woekGroup 负责处理其他事件。
如果觉得本文对你有帮助,可以转发关注支持一下
原文链接:https://aysaml.com/articles/2020/10/23/1603444872972.html?utm_source=tuicool&utm_medium=referral
相关推荐
- linux实例之设置时区的方式有哪些
-
linux系统下的时间管理是一个复杂但精细的功能,而时区又是时间管理非常重要的一个辅助功能。时区解决了本地时间和UTC时间的差异,从而确保了linux系统下时间戳和时间的准确性和一致性。比如文件的时间...
- Linux set命令用法(linux cp命令的用法)
-
Linux中的set命令用于设置或显示系统环境变量。1.设置环境变量:-setVAR=value:设置环境变量VAR的值为value。-exportVAR:将已设置的环境变量VAR导出,使其...
- python环境怎么搭建?小白看完就会!简简单单
-
很多小伙伴安装了python不会搭建环境,看完这个你就会了Python可应用于多平台包括Linux和MacOSX。你可以通过终端窗口输入"python"命令来查看本地是否...
- Linux环境下如何设置多个交叉编译工具链?
-
常见的Linux操作系统都可以通过包管理器安装交叉编译工具链,比如Ubuntu环境下使用如下命令安装gcc交叉编译器:sudoapt-getinstallgcc-arm-linux-gnueab...
- JMeter环境变量配置技巧与注意事项
-
通过给JMeter配置环境变量,可以快捷的打开JMeter:打开终端。执行jmeter。配置环境变量的方法如下。Mac和Linux系统在~/.bashrc中加如下内容:export...
- C/C++|头文件、源文件分开写的源起及作用
-
1C/C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称...
- linux中内部变量,环境变量,用户变量的区别
-
unixshell的变量分类在Shell中有三种变量:内部变量,环境变量,用户变量。内部变量:系统提供,不用定义,不能修改环境变量:系统提供,不用定义,可以修改,可以利用export将用户变量转为环...
- 在Linux中输入一行命令后究竟发生了什么?
-
Linux,这个开源的操作系统巨人,以其强大的命令行界面而闻名。无论你是初学者还是经验丰富的系统管理员,理解在Linux终端输入一条命令并按下回车后发生的事情,都是掌握Linux核心的关键。从表面上看...
- Nodejs安装、配置与快速入门(node. js安装)
-
Nodejs是现代JavaScript语言产生革命性变化的一个主要框架,它使得JavaScript从一门浏览器语言成为可以在服务器端运行、开发各种各样应用的通用语言。在不同的平台下,Nodejs的安装...
- Ollama使用指南【超全版】(olaplex使用方法图解)
-
一、Ollama快速入门Ollama是一个用于在本地运行大型语言模型的工具,下面将介绍如何在不同操作系统上安装和使用Ollama。官网:https://ollama.comGithub:http...
- linux移植(linux移植lvgl)
-
1uboot移植l移植linux之前需要先移植一个bootlader代码,主要用于启动linux内核,lLinux系统包括u-boot、内核、根文件系统(rootfs)l引导程序的主要作用将...
- Linux日常小技巧参数优化(linux参数调优)
-
Linux系统参数优化可以让系统更加稳定、高效、安全,提高系统的性能和使用体验。下面列出一些常见的Linux系统参数优化示例,包括修改默认配置、网络等多方面。1.修改默认配置1.1修改默认编辑器默...
- Linux系统编程—条件变量(linux 条件变量开销)
-
条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等...
- 面试题-Linux系统优化进阶学习(linux系统的优化)
-
一.基础必备优化:1.关闭SElinux2.FirewalldCenetOS7Iptables(C6)安全组(阿里云)3.网络管理服务||NetworkManager|network...
- 嵌入式Linux开发教程:Linux Shell
-
本章重点介绍Linux的常用操作和命令。在介绍命令之前,先对Linux的Shell进行了简单介绍,然后按照大多数用户的使用习惯,对各种操作和相关命令进行了分类介绍。对相关命令的介绍都力求通俗易懂,都给...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)