美文网首页并发专题
NIO Reactor模型 & Netty线程模型

NIO Reactor模型 & Netty线程模型

作者: packet | 来源:发表于2019-04-22 16:19 被阅读0次

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

    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.

    Reactor线程模型的基本思想是:分而治之 + 事件驱动

    1. 一个连接里完整的网络处理过程一般分为accept、read、decode、process、encode、send这几个步骤。Reactor将每个步骤抽象成一个网络事件(Task)
    2. 当每个Task就绪时,Reactor会收到网络通知,会把Task交给绑定了相应Task的Handler执行。

    Reactor模型的核心结构

    1. Reactor:响应器,负责响应事件
    2. Handler:处理器,负责处理事件
    3. Accepror:接收器,是事件处理器的一种,绑定了connect事件。当客户端发起connect操作时,Reactor会把connect事件,交给Acceptor处理。

    Reactor模型

    1. 单线程模型
    2. 多线程模型
    3. 主从多线程模型
    单线程模型

    优点:不需要并发控制,减少了上下文的切换
    缺点:不能使用多核CPU。一个线程需要处理所有网络时间,当并发量比较大的时候,难堪重负。


    多线程模型
    1. 有一个Reactor线程,用于监听服务端ServerSocketChannel,接收客户端的TCP连接请求。连接建立以后,会把socketChannel注册到worker thread中的selector上。
    2. IO读写事件,由一个线程池worker Thread Pool执行。(让reactor模型更专注)


      主从多线程模型

    这种模型使用了一个线程池reactor thread poll,这样就可以监听多个端口。


    netty线程模型

    netty的线程模型与Reactor主从多线程模型类似,有两个线程池
    bossGroup:如果只有一个服务器端口需要监听,则线程数量设置为1 。
    workerGroup

    通过上图可知,无论是哪个线程池,一个线程抽象为一个NioEventLoop,这是一个不断循环执行处理任务的线程,每个NioEventLoop有一个selector,用于监听绑定在其上的socket链路。
    什么是EventLoop?

    Will handle all the I/O operations for a {@link Channel} once registered.
    One {@link EventLoop} instance will usually handle more than one {@link Channel} but this may depend on implementation details and internals.

    每个NioEventLoop中包含有一个Selector,一个taskQueue,一个delayedTaskQueue

    1. 串行化设计:一个EventLoop可以处理多个Channel,是一对多的关系。
    2. 定时任务与事件轮:

    感谢:
    netty学习系列二:NIO Reactor模型 & Netty线程模型
    NIO系列——之Reactor模型

    20190808
    再度这篇文章,发现自己好多看不懂。
    每学习一个点,总得想想下面几个问题,大概就能厘清问题:

    1. 该技术在什么场景下会出现?用来解决什么问题?
    2. 空间结构是什么?时间流程是什么?

    有不明白的一点一点扣,比如java.nio.channels.SelectionKey#OP_READ
    参考:https://blog.51cto.com/stevex/1581934

    相关文章

      网友评论

        本文标题:NIO Reactor模型 & Netty线程模型

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