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

Reactor模型 三种模型 演变

    博客分类:
  • java
 
阅读更多

无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件。

1.2.1. 单线程模型

Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下:

1)作为NIO服务端,接收客户端的TCP连接;

2)作为NIO客户端,向服务端发起TCP连接;

3)读取通信对端的请求或者应答消息;

4)向通信对端发送消息请求或者应答消息。

Reactor单线程模型示意图如下所示:

图1-1 Reactor单线程模型

由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作。从架构层面看,一个NIO线程确实可以完成其承担的职责。例如,通过Acceptor类接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码。用户线程可以通过消息编码通过NIO线程将消息发送给客户端。

对于一些小容量应用场景,可以使用单线程模型。但是对于高负载、大并发的应用场景却不合适,主要原因如下:

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

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

3)可靠性问题:一旦NIO线程意外跑飞,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。

为了解决这些问题,演进出了Reactor多线程模型,下面我们一起学习下Reactor多线程模型。

1.2.2. 多线程模型

Rector多线程模型与单线程模型最大的区别就是有一组NIO线程处理IO操作,它的原理图如下:

图1-2 Reactor多线程模型

Reactor多线程模型的特点:

1)有专门一个NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP连接请求;

2)网络IO操作-读、写等由一个NIO线程池负责,线程池可以采用标准的JDK线程池实现,它包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码和发送;

3)1个NIO线程可以同时处理N条链路,但是1个链路只对应1个NIO线程,防止发生并发操作问题。

在绝大多数场景下,Reactor多线程模型都可以满足性能需求;但是,在极个别特殊场景中,一个NIO线程负责监听和处理所有的客户端连接可能会存在性能问题。例如并发百万客户端连接,或者服务端需要对客户端握手进行安全认证,但是认证本身非常损耗性能。在这类场景下,单独一个Acceptor线程可能会存在性能不足问题,为了解决性能问题,产生了第三种Reactor线程模型-主从Reactor多线程模型。

1.2.3. 主从多线程模型

主从Reactor线程模型的特点是:服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求处理完成后(可能包含接入认证等),将新创建的SocketChannel注册到IO线程池(sub reactor线程池)的某个IO线程上,由它负责SocketChannel的读写和编解码工作。Acceptor线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的IO线程上,由IO线程负责后续的IO操作。

它的线程模型如下图所示:

图1-3 主从Reactor多线程模型

利用主从NIO线程模型,可以解决1个服务端监听线程无法有效处理所有客户端连接的性能不足问题。

它的工作流程总结如下:

  1. 从主线程池中随机选择一个Reactor线程作为Acceptor线程,用于绑定监听端口,接收客户端连接;
  2. Acceptor线程接收客户端连接请求之后创建新的SocketChannel,将其注册到主线程池的其它Reactor线程上,由其负责接入认证、IP黑白名单过滤、握手等操作;
  3. 步骤2完成之后,业务层的链路正式建立,将SocketChannel从主线程池的Reactor线程的多路复用器上摘除,重新注册到Sub线程池的线程上,用于处理I/O的读写操作

 

http://www.infoq.com/cn/articles/netty-threading-model/

分享到:
评论

相关推荐

    Netty案例集锦(并发编程篇)

    Reactor模型是处理并发事件的一种策略,分为单线程、多线程和主从多线程三种模型。在单线程模型中,一个线程处理所有事件;多线程模型则会为每个事件分配独立的线程;主从多线程模型则通过一个主线程负责调度,子线...

    Scalable IO in Java.zip

    文章中基于Reactor反应器模式的几种服务模型架构,阅读这篇文章有助于你更深入了解Netty等服务框架的编程思想与设计模式。同时压缩包内还包含reactor-siemens.pdf描述reactor的英文论文,有助于加深reactor模式的...

    scalable-io-in-java-中文.pdf

    3. **Reactor模式**:Reactor是Java NIO的基础,它是一种基于事件驱动的设计模式,用于高效地处理多个事件源。Reactor模式的核心思想是定义了线程和事件处理器之间的协作机制,其中线程在事件发生时调用相应的事件...

    netty原理的讲解

    总而言之,Netty通过优化的NIO模型、Reactor模式和高度可定制的处理流程,为Java开发者提供了构建高性能网络应用的强大工具。学习Netty不仅需要理解IO流的演变,还需要掌握其独特的设计理念和实现机制。通过深入学习...

    c10k

    在这个问题出现之前,服务器通常采用一种称为“一次一连接”的模型,即每次只有一个连接被处理,其他连接必须等待。但这种模型在面对成千上万的并发连接时显然无法胜任。为了解决c10k问题,程序员和系统架构师们发展...

    Twisted document

    该平台不仅限于传统的服务器/客户端模型,还支持多种异步模式和高级网络功能,如分布式计算、Web 服务、即时通信等。 #### 二、入门指南:编写服务器与客户端 ##### 2.1 编写服务器 **2.1.1 概览** 在 Twisted 中...

    twisted_book

    - **reactor**:Twisted 的 reactor 是其核心组件,负责管理所有事件的调度。 - **协议实现**:Twisted 包括了大量的协议实现,如 TCP、UDP、SSL 等。 - **连接管理**:Twisted 提供了强大的连接管理和错误处理机制...

    webserver重新定义

    2. **高性能与可扩展性**:随着高并发访问和大数据量的需求,Web服务器需要具备更好的性能和可扩展性,例如使用异步非阻塞I/O模型,如Event-driven或Reactor模式,以及水平扩展能力。 3. **微服务架构**:Web服务器...

    twsited官方开发入门手册

    其核心理念在于为开发者提供一个高效、灵活且易于使用的异步编程模型。通过这种方式,Twisted 致力于简化网络应用程序的开发过程,并提高其性能。 **1.2 高层次概述** Twisted 架构设计精妙,主要由以下几个部分...

Global site tag (gtag.js) - Google Analytics