美文网首页
Netty与Reactor 模式

Netty与Reactor 模式

作者: coding400 | 来源:发表于2019-11-27 19:03 被阅读0次

    前言

    Netty 的线程模型是基于NIO的Selector 构建的,使用了异步驱动的Reactor 模式来构建的线程模型,可以很好的支持成百上千的 SocketChannel 连接。由于 READ/WRITE 都是非阻塞的,可以充分提升I/O线程的运行效率 ,避免了IO阻塞导致线程挂起, 同时可以让一个线程支持对多个客户端的连接SocketChannel的 READ/WRITE 操作, 从根本上解决了传统阻塞IO的一线程处理一连接的弊端。

    高效率的Reactor模式

    The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.

    来自维基百科:https://en.wikipedia.org/wiki/Reactor_pattern

    (是一种为处理服务请求并发 提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序。)

    常见的reactor模式有以下三种

    • 单线程reactor
    • 多线程reactor
    • 主从reactor

    一. 单线程reactor

    image.png

    ractor 单线程模式是指所有的I/O操作都在一个NIO线程完成,该线程的职责:

    1.作为NIO服务端,接收客户端TCP连接
    2.作为NIO客户端,向客户端发送TCP连接
    3.READ/WRITE 客户端的请求

    不过单线程的reactor 模式无法发挥多核的优势,因此对于高并发量的系统仍然存在瓶颈,主要原因如下:

    1. reactor 线程既要处理来自客户端的连接,又要处理READ/WRITE/编码/解码。即便cpu 100% 也难以满足实际场景的需求
    2. 多线程Reactor 解决了这些问题

    二.多线程Reactor

    image.png

    reactor 多线程的实现最大的区别是拥有一个专门用来处理实际I/O 操作是线程池

    优点:

    1. 拥有一个Acceptor 专门用来监听请求的I/O 类型
    2. 使用专门线程池可以提高acceptor的并发量,并且可以将同一个SocketChannel 放于同一个I/O 线程处理,同一个I/O线程可以处理多个SocketChannel的READ/WRITE事件

    在大部分场景,该线程模型都能处理,但存在这样一种场景:单个Acceptor 线程 可能会因为需要监听大量的 SocketChannel 连接 或 I/O事件处理或在建立建立时需要进行安全的握手认证、黑白名单过滤,而导致出现性能瓶颈。所以这种场景下,单独一个Accceptor 会导致性能不足,便出现了第三种线程模型,主从Reactor 模型

    三.主从Reactor

    image.png

    相比多线程reactor模型,主从reactor多线程模型拥有了一个独立处理 SocketChannel 连接的线程池,当客户端从Acceptor建立连接之后,便将该连接绑定到subreactor 线程池中的某个线程中,然后由该线程绑定客户端感兴趣的I/O事件(READ/WRITE),监听客户端连接请求,最后处理。

    mainReactor : 监听 ServerSocketChannel 、建立与 SocketChannel 的连接、将完成建立连接之后的Socket 交给subReactor

    subReactor : 监听SocketChannel的 I/O事件,完成编解码、相应的业务处理(默认为CPU个数)

    相关文章

      网友评论

          本文标题:Netty与Reactor 模式

          本文链接:https://www.haomeiwen.com/subject/julmwctx.html