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线程模型的理解。

相关文章
|
3月前
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
|
26天前
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
28天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
17 1
|
2月前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
98 20
剖析 Redis List 消息队列的三种消费线程模型
|
1月前
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
49 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
1月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
2月前
|
存储 机器人 Linux
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty(二)-服务端网络编程常见网络IO模型讲解
|
1月前
|
消息中间件 NoSQL 关系型数据库
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
25 0
|
4月前
|
缓存 编译器 Go
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
55 3
|
4月前
|
算法 调度 人工智能
人工智能线程问题之无锁化编程如何解决
人工智能线程问题之无锁化编程如何解决
48 2