Netty中提供了哪些线程模型?

简介: 最近,我更新了一些Netty相关的内容,于是有很多粉丝开始私信问我一些关于Netty的问题。今天,给大家分享一个大家问得比较多问题,Netty中提供了哪些线程模型?

最近,我更新了一些Netty相关的内容,于是有很多粉丝开始私信问我一些关于Netty的问题。今天,给大家分享一个大家问得比较多问题,Netty中提供了哪些线程模型?

另外,我花了1个多星期,准备了一份10W字的面试题解析配套文档,想获取的小伙伴可以从我的个人煮叶简介中找到。

a5b86e1bc881515d90969f2a9d40ed28.jpg

说到线程模型,又不得不说Netty中的Reactor,Reactor直译过来叫做反应堆,它是Netty支持异步多线程的核心组件。常见的Reactor线程模型有三种,分别是:Reactor单线程模型、Reactor多线程模型、主从Reactor多线程模型;

【导航条:单线程】

1、单线程单Reactor模型

在Reactor模型有三个重要的组件:

1b635faf7a6a1bf338db27b54ccc3cbc.jpg

1、Reactor :主要负责将I/O事件发派给对应的Handler

2、Acceptor :用于处理客户端连接请求

3、Handlers :执行非阻塞的I/O读写任务

首先来看单线程单Reactor模型,如图所示:

69c42ed41f56b35edd7c3c659ff8c5a2.jpg

单线程Reactor这种实现方式存在缺点,因为,Handler的执行是串行的,如果其中一个Handler处理线程阻塞,将导致其他的业务处理也会阻塞。而Handler和Reactor在同一个线程中的执行,这也将导致无法接收新的请求。

2、多线程单Reactor模型

为了解决单线程Reactor的问题,有人提出使用多线程的方式来处理业务逻辑,也就是在业务处理的地方加入线程池,实现异步处理,这样将Reactor和Handler就放在不同的线程中来执行,这就是多线程单Reactor模型。

7d7456e4dc39a1c4745dfcd2e7920214.jpg

但是,问题又来了,在多线程单Reactor模型中,所有的I/O操作是由一个Reactor来完成,而 运行在单个线程中,它需要处理包括accept()/read() /write()/connect()等操作,在并发量小的情况下影响不大。一旦并发量上来,出现高负载、高并发或大数据量的应用场景时,容易成为瓶颈,主要有以下2个原因:

3b63a06873a20acc4c83cd20cdfccc82.jpg

1、一个NIO线程同时处理成百上千的链路,性能上无法支撑,即便NIO线程的CPU 达到100%,也无法满足海量消息的读取和发送;

2、当NIO线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往会进行重发,这更加重了NIO线程的负载,最终会导致大量消息积压和处理超时,成为系统的性能瓶颈;

所以,我们还可以更进一步优化,引入了主从Reactor多线程模式:

3、主从Reactor多线程模型

3b6038d3d6ae29ea1491c236e8b31e30.jpg

如图所示,在主从Reactor多线程模型中,由三个主要的角色:

5a679dc652a1c582c53e7a8b1d724a7d.jpg

Main Reactor:负责接收客户端的连接请求,并将具体的业务IO处理请求转发给 Sub Reactor(其中Sub Reactor可以有多个)。

Acceptor:请求接收者,它的职责类似服务器,并不真正负责连接请求的建立,而只将其请求委托 Main Reactor 线程池来实现,起到一个转发的作用。

Sub Reactor:负责数据的读写,在 NIO 中 通常注册通道的读事件(OP_READ)和写事件(OP_WRITE)。

好了,以上就是我对Netty线程模型的理解。

相关文章
|
2月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
177 2
|
7月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
7月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
134 1
|
9月前
|
缓存 NoSQL 中间件
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
242 6
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
剖析 Redis List 消息队列的三种消费线程模型
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
187 1
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
389 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
存储 机器人 Linux
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty(二)-服务端网络编程常见网络IO模型讲解

热门文章

最新文章