Netty学习笔记三:Netty线程模型和Reactor模式

1. Netty学习笔记三:Netty线程模型和Reactor模式

文章目录

      • 1. Netty学习笔记三:Netty线程模型和Reactor模式
        • 1.1. Reactor模式
        • 1.2. Reactor模型
          • 1.2.1. Reactor单线程模型
          • 1.2.2. Reactor多线程模型
          • 1.2.3. Reactor主从线程模型
        • 1.3. 几个争议问题

1.1. Reactor模式

  1. Reactor模式(反应器设计模式)是一种基于事件驱动的设计模式,在事件驱动的应用中,将一个或多个客户的服务请求分离和调度(dispatch)给应用程序,在事件驱动应用程序中,同步地、有序地处理同时接收的多个服务请求,一般出现在多个高并发系统中,比如Netty,Redis等。Reactor模式基于事件驱动,适合做海量的I/O事件,属于同步非阻塞I/O。
  2. 优点

一、响应快,不会因为单个同步而阻塞,虽然Reactor本身依然是同步的;

二、编程相对简单,最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销。

三、可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源。

  1. 缺点

一、相对传统的简单模型,Reactor增加了一定的复杂性,因而有一定的门槛,并且不易于调试。

二、Reactor模式需要系统底层的支持,比如java中的Selector的支持,操作系统中Select系统的调用。

  1. 个人理解:

Reactor的作用就是:当客户端发来消息时,客户端如何进行对消息处理,如何将消息放到相应的实现类里面。

1.2. Reactor模型

1.2.1. Reactor单线程模型
  1. 内容:

一、作为NIO服务端,接收客户端的TCP连接,作为NIO客户端,向服务端发起TCP连接;

二、服务端读请求数据并响应,客户端写请求并读取响应。

  1. 使用场景

对应与小业务,编码简单,对于高负债,高并发不适合,会出现大量请求超时,万一一个线程挂了,就不能用了。这个模型很少用到。

  1. 图解

Netty学习笔记三:Netty线程模型和Reactor模式_第1张图片

1.2.2. Reactor多线程模型
  1. 内容

一个Acceptor线程,一组NIO线程,一般是使用自带的线程池,包含一个任务队列和多个可用的线程。

  1. 使用场景

可满足大多数场景,但是当Acceptor需要做复杂操作的时候,比如认证 等耗时操作,在高并发情况下则会有性能问题。

  1. 图解

Netty学习笔记三:Netty线程模型和Reactor模式_第2张图片

1.2.3. Reactor主从线程模型
  1. 内容

Acceptor不再是一个线程,而是一组NIO线程;IO线程也是一组NIO线程,这样就是两个线程池去处理接入连接和处理IO。

  1. 使用场景

满足目前的大部分场景,也是Netty推荐使用的线程模型。

1.3. 几个争议问题

  1. 为什么Netty使用的是NIO而不是AIO,即Netty是同步非阻塞还是异步非阻塞。

LInux系统上,AIO的底层仍使用EPOLL,与NIO相同,因此在性能上没有明显的优势。

Netty整体架构是Reactor模型,采用epoll机制,所以往深的说还是IO多路复用模式,所以可以说Netty是同步非阻塞模型。但是很多人说这是netty基于java NIO类库实现的异步通信框架。

Netty特点是:异步非阻塞,基于事件驱动,性能高,高可靠性,高可定制型。

你可能感兴趣的:(Netty架构学习笔记)