`
longzhun
  • 浏览: 370007 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Netty高性能之Reactor线程模型

 
阅读更多

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建

传统通信采用了同步阻塞IO,当客户端的并发压力或者网络时延增大之后,同步阻塞IO会由于频繁的wait导致IO线程经常性的阻塞,由于线程无法高效的工作,IO处理能力自然下降。

我们通过BIO通信模型图看下BIO通信的弊端

 

采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,接收到客户端连接之后为客户端连接创建一个新的线程处理请求消息,处理完成之后,返回应答消息给客户端,线程销毁,这就是典型的一请求一应答模型

该架构最大的问题就是不具备弹性伸缩能力,当并发访问量增加后,服务端的线程个数和并发访问数成线性正比,由于线程是JAVA虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能急剧下降,随着并发量的继续增加,可能会发生句柄溢出、线程堆栈溢出等问题,并导致服务器最终宕机。

Netty基于NIO,实现了对NIO的封装及优化,从而Netty的通信模式为异步非阻塞通信

在IO编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者IO多路复用技术进行处理。IO多路复用技术通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源。

JDK1.4提供了对非阻塞IO(NIO)的支持,JDK1.6版本使用epoll替代了传统的select/poll,极大的提升了NIO通信的性能

Netty架构按照Reactor模式设计和实现,它的服务端通信序列图如下


 



Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起。另外,由于Netty采用了异步通信模式,一个IO线程可以并发处理N个客户端连接和读写操作,这从根本上解决了传统同步阻塞IO一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。

 

何为Reactor线程模型

Reactor模式是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler


从结构上,这有点类似生产者消费者模式,即有一个或多个生产者将事件放入一个Queue中,而一个或多个消费者主动的从这个Queue中Poll事件来处理;而Reactor模式则并没有Queue来做缓冲,每当一个Event输入到Service Handler之后,该Service Handler会立刻的根据不同的Event类型将其分发给对应的Request Handler来处理

 

这个做的好处有很多,首先我们可以将处理event的Request handler实现一个单独的线程,即


这样Service Handler 和request Handler实现了异步,加快了service Handler处理event的速度,那么每一个request同样也可以以多线程的形式来处理自己的event,即Thread1 扩展成Thread pool 1,

 

 

Netty的Reactor线程模型1 Reactor单线程模型     Reactor机制中保证每次读写能非阻塞读写


一个线程(单线程)来处理CONNECT事件(Acceptor),一个线程池(多线程)来处理read,一个线程池(多线程)来处理write,那么从Reactor Thread到handler都是异步的,从而IO操作也多线程化。

到这里跟BIO对比已经提升了很大的性能,但是还可以继续提升,由于Reactor Thread依然为单线程,从性能上考虑依然有所限制

2 Reactor多线程模型


这样通过Reactor Thread Pool来提高event的分发能力

3 Reactor主从模型


 

 

Netty的高效并发编程主要体现在如下几点:

1) volatile的大量、正确使用;

2) CAS和原子类的广泛使用;

3) 线程安全容器的使用;

4) 通过读写锁提升并发性能。

Netty除了使用reactor来提升性能,当然还有

1、零拷贝,IO性能优化

2、通信上的粘包拆包

2、同步的设计

 

3、高性能的序列

分享到:
评论

相关推荐

    Netty核心精讲之Reactor线程模型源码分析.mp4

    在深入探讨Netty的Reactor线程模型源码之前,我们需要先理解Reactor模式的基本概念。 Reactor模式是一种设计模式,常用于处理并发I/O事件。在多路复用I/O(如epoll、kqueue)中,Reactor模式是关键组成部分,它负责...

    简单了解Java Netty Reactor三种线程模型

    综上所述,Reactor线程模型是理解Netty高性能的关键,通过单线程、多线程和主从线程模型的演进,Netty能够灵活地应对各种网络应用场景,保证了在大规模并发情况下的稳定性和效率。在实际开发中,根据系统的具体需求...

    聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇).doc

    在 Netty 服务端,核心引擎采用了主从 Reactor 多线程模型,该模型在 Doug Lea 的“Scalable IO in Java”论文中有所提及,但 Netty 在实现上有所不同。 主 Reactor Group 和从 Reactor Group 是 Netty 中的两个...

    Netty系列之Netty高性能实践.pdf

    Netty通过优化的Reactor线程模型解决了这些问题,它可以有效地处理大规模并发连接,减少线程创建和销毁的开销。 Netty的高性能主要体现在以下几个方面: 1. **传输层**:Netty支持多种传输模式,包括BIO、NIO和AIO...

    03-04-04-Netty高性能之道1

    《Netty高性能之道》 Netty作为一款高性能的网络应用框架,其卓越的性能表现得益于其深入优化的网络通信机制。相较于传统的Java序列化和基于BIO(Blocking IO)的通信框架,Netty借助NIO(Non-blocking IO)框架...

    读懂Netty的高性能架构之道.docx编程资料

    ### 读懂Netty的高性能架构之道 #### 一、引言 随着互联网技术的发展与应用场景的不断拓宽,网络通信框架的性能与效率成为了系统架构设计中的关键因素之一。Netty作为一个高性能、异步事件驱动的NIO框架,在互联网...

    netty5多线程编程

    总结来说,Netty5的多线程编程是一个复杂的主题,它不仅涉及对Netty框架内部事件驱动和线程模型的理解,也需要掌握Java并发编程的基础知识,包括Java内存模型、多线程安全、锁、volatile关键字以及CAS指令等。...

    基于Netty的高性能RPC框架 .zip

    该项目通过Spring容器管理服务定义和实现,采用主从Reactor线程模型提升服务器并行吞吐性能。 主要特性 高性能基于Netty的高性能网络通信。 多序列化支持支持Kryo、Hessian、Protostuff等多种序列化方式。 ...

    NIO框架Netty实现高性能高并发

    Java异步NIO框架Netty实现高性能高...心的设计Reactor线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下Netty是如何支持10W TPS的跨节点远程服务调用的,在正式开始讲解之前,我们先简单介绍下Netty。

    04-Netty线程模型源码剖析1

    Netty采用主从Reactor线程模型,旨在最大化并发处理能力,减少线程上下文切换的开销,实现高效的非阻塞I/O。 首先,Netty的线程模型由NioEventLoop(主Reactor)和一系列的子Reactor组成。NioEventLoop负责处理I/O...

    MINA2与Netty4比较分析

    Netty4同样使用了Reactor模式,但其线程模型更为灵活,包括了单线程模型、多线程模型和主从Reactor多线程模型。Netty4的Reactor单线程模型适用于小容量的应用场景,当NIO线程负载过重时,单线程模型就会成为瓶颈。...

    netty+thrift高并发高性能

    ### Netty+Thrift 实现高并发高性能的关键技术解析 #### 一、引言 在当前互联网技术高速发展的背景下,高性能、高并发的服务框架成为众多企业和开发者追求的目标。Netty作为一款高性能、异步事件驱动的网络应用...

    Netty高性能网络应用框架 v4.1.87.gz

    Netty是一款广泛应用于Java领域的高性能、异步事件驱动的网络应用程序框架,专为开发协议服务器和客户端而设计。它的核心是基于NIO(非阻塞I/O)的,旨在简化网络编程,提供高效的网络通信能力。Netty v4.1.87.Final...

    咕泡学院_Tom_JavaVIP课程_高性能框架Netty1

    3) **线程**:Netty采用Reactor线程模型,有效地处理读取、编解码和消息派发,确保高效执行。 Netty的异步非阻塞通信模型如下: - 客户端发起连接请求,ServerSocketChannel监听并接收连接。 - 接收到连接后,Netty...

    Netty 是如何支撑高性能网络通信的.docx

    Netty 之所以能实现高性能,主要归功于其对传统RPC调用性能瓶颈的解决,以及对I/O模型、序列化、线程模型等多个关键领域的优化。 首先,Netty 改进了传统的RPC调用性能问题。传统RPC框架如RMI往往采用同步阻塞I/O,...

    最透彻的的Netty高性能原理和框架架构解析.pdf

    2. **在线教程与博客**:如《高性能网络编程(五):一文读懂高性能网络编程中的 I/O 模型》、《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》等。 3. **社区讨论与问答**:加入 Netty 的官方论坛或 ...

    聊聊Netty那些事儿之从内核角度看IO模型.doc

    从内核角度看IO模型是理解Netty高性能异步事件驱动网络框架的基础。本文从阻塞与非阻塞、同步与异步的概念开始,引出了五种IO模型,并对select、poll、epoll的原理和对比进行了介绍。最后,文章还介绍了两种IO线程...

    总结Netty(RPC高性能之道)原理剖析.docx

    而Netty使用Reactor模式,一个Reactor线程聚合一个多路复用器Selector,它可以同时注册、监听和轮询成百上千个Channel,一个IO线程可以同时并发处理N个客户端连接,线程模型优化为1:N(N<进程可用的最大句柄数)...

Global site tag (gtag.js) - Google Analytics