一.背景
1.Java线程模型的演进
a.单线程
时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一。
在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能。
b.多线程
随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核。通过多线程并发编程,可以充分利用多核CPU的处理能力,提升系统的处理效率和并发性能。
从2005年开始,随着多核处理器的逐步普及,java的多线程并发编程也逐渐流行起来,当时商用主流的JDK版本是1.4,用户可以通过 new Thread()的方式创建新的线程。
由于JDK1.4并没有提供类似线程池这样的线程管理容器,多线程之间的同步、协作、创建和销毁等工作都需要用户自己实现。由于创建和销毁线程是个相对比较重量级的操作,因此,这种原始的多线程编程效率和性能都不高。
c. 线程池
为了提升Java多线程编程的效率和性能,降低用户开发难度。JDK1.5推出了java.util.concurrent并发编程包。在并发编程类库中,提供了线程池、线程安全容器、原子类等新的类库,极大的提升了Java多线程编程的效率,降低了开发难度。
从JDK1.5开始,基于线程池的并发编程已经成为Java多核编程的主流。
2.Reactor模型
无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件。
a.单线程模型
Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下:
1)作为NIO服务端,接收客户端的TCP连接;
2)作为NIO客户端,向服务端发起TCP连接;
3)读取通信对端的请求或者应答消息;
4)向通信对端发送消息请求或者应答消息。
Reactor单线程模型示意图如下所示:
由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作。从架构层面看,一个NIO线程确实可以完成其承担的职责。例如,通过Acceptor类接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码。用户线程可以通过消息编码通过NIO线程将消息发送给客户端。
对于一些小容量应用场景,可以使用单线程模型。但是对于高负载、大并发的应用场景却不合适,主要原因如下:
1)一个NIO线程同时处理成百上千的链路,性能上无法支撑,即便NIO线程的CPU负荷达到100%,也无法满足海量消息的编码、解码、读取和发送;
2)当NIO线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往会进行重发,这更加重了NIO线程的负载,最终会导致大量消息积压和处理超时,成为系统的性能瓶颈;
3)可靠性问题:一旦NIO线程意外跑飞,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。
为了解决这些问题,演进出了Reactor多线程模型,下面我们一起学习下Reactor多线程模型。
b.多线程模型
Rector多线程模型与单线程模型最大的区别就是有一组NIO线程处理IO操作,它的原理图如下:
Reactor多线程模型的特点:
1)有专门一个NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP连接请求;
2)网络IO操作-读、写等由一个NIO线程池负责,线程池可以采用标准的JDK线程池实现,它包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码和发送;
3)1个NIO线程可以同时处理N条链路,但是1个链路只对应1个NIO线程,防止发生并发操作问题。
在绝大多数场景下,Reactor多线程模型都可以满足性能需求;但是,在极个别特殊场景中,一个NIO线程负责监听和处理所有的客户端连接可能会存在性能问题。例如并发百万客户端连接,或者服务端需要对客户端握手进行安全认证,但是认证本身非常损耗性能。在这类场景下,单独一个Acceptor线程可能会存在性能不足问题,为了解决性能问题,产生了第三种Reactor线程模型-主从Reactor多线程模型。
c.主从多线程模型
主从Reactor线程模型的特点是:服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求处理完成后(可能包含接入认证等),将新创建的SocketChannel注册到IO线程池(sub reactor线程池)的某个IO线程上,由它负责SocketChannel的读写和编解码工作。Acceptor线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的IO线程上,由IO线程负责后续的IO操作。
它的线程模型如下图所示:
利用主从NIO线程模型,可以解决1个服务端监听线程无法有效处理所有客户端连接的性能不足问题。
它的工作流程总结如下:
1).从主线程池中随机选择一个Reactor线程作为Acceptor线程,用于绑定监听端口,接收客户端连接;
2).Acceptor线程接收客户端连接请求之后创建新的SocketChannel,将其注册到主线程池的其它Reactor线程上,由其负责接入认证、IP黑白名单过滤、握手等操作;
3).步骤2)完成之后,业务层的链路正式建立,将SocketChannel从主线程池的Reactor线程的多路复用器上摘除,重新注册到Sub线程池的线程上,用于处理I/O的读写操作。
二.Netty线程模型
1.Netty线程模型分类
事实上,Netty的线程模型与1.2章节中介绍的三种Reactor线程模型相似,下面章节我们通过Netty服务端和客户端的线程处理流程图来介绍Netty的线程模型。
a.服务端线程模型
一种比较流行的做法是服务端监听线程和IO线程分离,类似于Reactor的多线程模型,它的工作原理图如下:
下面我们结合Netty的源码,对服务端创建线程工作流程进行介绍:
第一步,从用户线程发起创建服务端操作,代码如下:
文章来源:http://blog.csdn.net/suifeng3051/article/details/44747333
相关推荐
Java Netty Reactor 三种线程模型详解 Java Netty 是一个高性能的网络编程框架,Reactor 模式是其核心组件之一。Reactor 模式是指在网络编程中,使用单个线程或多个线程来处理所有的IO操作。下面我们将详细介绍 ...
#### 四、Vert.x与Netty的线程模型对比 - **Netty**:Netty使用两个线程池:Boss Group和Worker Group。Boss Group负责接收新的连接,而Worker Group则处理连接上的I/O操作。 - **Vert.x**:虽然Netty也是Vert.x的...
Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它规定了程序中各个线程如何访问共享变量,以及对这些访问进行同步控制的规则。理解Java内存模型对于编写多线程并发程序至关...
- **线程模型**:高效的线程模型,确保事件处理的高效性。 - **高度定制化**:可以根据业务需求灵活配置。 #### 三、Java NIO 深度解析 - **NIO介绍**:Java NIO (New IO) 是Java 1.4版本后引入的新API,用于...
6. **性能优化**:Netty的性能优化策略,如内存管理、线程模型调整、缓冲区复用等,以提高系统的吞吐量和响应速度。 7. **Netty底层原理**:探讨Netty如何利用Java NIO实现异步非阻塞I/O,以及零拷贝技术的工作机制...
Netty通过采用优化过的Reactor模式,结合多线程模型和NIO技术,为开发者提供了一个高性能且灵活的网络框架。其主从多线程模型不仅提高了系统的并发处理能力,还有效降低了主Reactor的压力,使得系统能够在大规模并发...
传统的Java I/O基于BIO(Blocking I/O),这种模型在高并发场景下效率较低,因为它会阻塞一个线程直到I/O操作完成。而NIO(Non-blocking I/O)引入了选择器(Selector)和通道(Channel)的概念,允许多个连接在同一...
总而言之,Netty通过优化的NIO模型、Reactor模式和高度可定制的处理流程,为Java开发者提供了构建高性能网络应用的强大工具。学习Netty不仅需要理解IO流的演变,还需要掌握其独特的设计理念和实现机制。通过深入学习...
72_Netty线程模型深度解读与架构设计原则 73_Netty底层架构系统总结与应用实践 74_Netty对于异步读写操作的架构思想与观察者模式的重要应用 75_适配器模式与模板方法模式在入站处理器中的应用 76_Netty项目开发过程...
第72讲:Netty线程模型深度解读与架构设计原则 第73讲:Netty底层架构系统总结与应用实践 第74讲:Netty对于异步读写操作的架构思想与观察者模式的重要应用 第75讲:适配器模式与模板方法模式在入站处理器中的...
- **线程模型和性能调优**:讨论Netty的线程模型,以及如何根据实际需求调整配置以优化性能。 - **异常处理和故障恢复**:介绍Netty的错误处理机制,如何编写健壮的网络应用。 - **实战案例**:提供实际的项目案例,...
2. **Netty的异步模型**:Netty的非阻塞I/O模型非常适合WebSocket服务器,因为它可以高效地处理大量的并发连接。每个连接只需要一个线程来管理,这大大提高了服务器的可伸缩性。 3. **WebSocket协议特性**:...
#### 三、Netty编程模型详解 - **启动类**:创建ServerBootstrap实例,设置ServerSocketChannel选项、ChannelInitializer、ChannelHandler等。 - **ChannelInitializer**:初始化ChannelPipeline,为Channel注册...
Netty 高性能原理和框架架构解析 Netty 是一个广受欢迎的异步事件驱动的 Java 开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。...* 《Netty 4.x 学习(三):线程模型详解》
3. **多Reactor多线程模型**:这是Netty默认采用的模型。它进一步将Reactor分为两个角色——主Reactor(Boss)和次Reactor(Worker)。主Reactor负责监听服务器套接字,接受新的连接请求,并将其分配给次Reactor。次...
- **Thread Model**:Netty提供了一种灵活的线程模型,可以自定义线程池配置来满足不同的场景需求。 #### 二、Netty并发编程的关键技术点 ##### 2.1 EventLoopGroup EventLoopGroup是Netty中管理一组EventLoop的...
Netty是一个基于NIO的高性能、高可靠的网络通信框架,它简化了网络应用的开发,提供了事件驱动和异步的编程模型,能够快速构建出TCP、UDP等协议的服务器和客户端。Netty在BIO和NIO的基础上,通过其强大的API和设计...
- **性能**: Netty内部使用了多线程模型,通过合理分配任务到不同的线程中执行,避免了单一线程处理所有请求带来的瓶颈问题。同时,通过对底层I/O操作的精细控制,实现了极低的延迟和极高的吞吐量。 - **扩展性**: ...
Netty是一个基于NIO的高性能网络通信框架,它提供了许多强大的特性,如零拷贝、高性能的线程模型、高效的内存管理以及丰富的协议支持。Netty的EventLoop(事件循环)和ChannelHandler(通道处理器)设计使得网络...