并发专题

NIO Reactor模型 & Netty线程模型

2019-04-22  本文已影响0人  packet

什么是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

上一篇下一篇

猜你喜欢

热点阅读