NIO Reactor模型 & Netty线程模型
什么是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线程模型的基本思想是:分而治之 + 事件驱动
- 一个连接里完整的网络处理过程一般分为accept、read、decode、process、encode、send这几个步骤。Reactor将每个步骤抽象成一个网络事件(Task)
- 当每个Task就绪时,Reactor会收到网络通知,会把Task交给绑定了相应Task的Handler执行。
Reactor模型的核心结构
- Reactor:响应器,负责响应事件
- Handler:处理器,负责处理事件
- Accepror:接收器,是事件处理器的一种,绑定了connect事件。当客户端发起connect操作时,Reactor会把connect事件,交给Acceptor处理。
Reactor模型
- 单线程模型
- 多线程模型
- 主从多线程模型
优点:不需要并发控制,减少了上下文的切换
缺点:不能使用多核CPU。一个线程需要处理所有网络时间,当并发量比较大的时候,难堪重负。
多线程模型
- 有一个Reactor线程,用于监听服务端ServerSocketChannel,接收客户端的TCP连接请求。连接建立以后,会把socketChannel注册到worker thread中的selector上。
-
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
- 串行化设计:一个EventLoop可以处理多个Channel,是一对多的关系。
- 定时任务与事件轮:
感谢:
netty学习系列二:NIO Reactor模型 & Netty线程模型
NIO系列——之Reactor模型
20190808
再度这篇文章,发现自己好多看不懂。
每学习一个点,总得想想下面几个问题,大概就能厘清问题:
- 该技术在什么场景下会出现?用来解决什么问题?
- 空间结构是什么?时间流程是什么?
有不明白的一点一点扣,比如java.nio.channels.SelectionKey#OP_READ
参考:https://blog.51cto.com/stevex/1581934