如何理解网络 IO 模型
从组成部分反过来理解网络模型
(如果不清楚 IO 模型可以先参考最下方的第一个链接进行了解,或自行搜索)
一、组成部分
在进入常见模型之前,我们先分析一下网络 IO 模型的大致组成部分。
第一部分:建立连接。
第二部分:读取与发送数据。(读取数据后,接着进入第三部分业务处理,然后再返回此处进行发送数据)
第三部分:业务处理。
二、常见模型
我们可以从上面这 3 个部分,反过来理解常见的 IO 模型/网络 IO 模型
1、BIO
单线程模型,这 3 个部分都由同一个进程或者线程负责。而且每个连接都需要新建立一个线程处理。
2、NIO
IO 多路复用模型,由单个线程负责接收并建立所有连接(当一个连接正在被处理时,其他连接请求会被阻塞并等待),然后由单/多线程处理第二和第三部分。NIO 重点在于如何处理第一部分。(可以参考最下方的链接进一步了解。)
3、Reactor 模型
3.1、单 Reactor 单线程模型,属于 NIO 的一种实现。此时,进入第一、第二、第三部分的同一个请求处于同一线程。需要完成前一个请求的所有过程才能进入下一个请求。
3.2、单 Reactor 多线程模型,属于 NIO 的一种实现。此时,reactor 线程负责按顺序处理请求的第一和第二部分,进入第一和第二部分的请求处于同一线程。第三部分则使用线程池中的其他线程进行处理。
3.3、多 Reactor 多线程模型,属于 NIO 的一种。此时主 reactor 线程负责处理第一部分,然后分发给子 reactor 中的多个线程处理第二部分。第三部分则使用线程池中的其他线程进行处理。
这 3 种 Reactor 模型的性能依次提升,但复杂度也是随之提升。所以应该根据系统的需要去选择,避免盲目选择性能最高的模型,导致系统复杂度迅速上升。
深入学习:其实 Reactor 模型中的每一个 reactor 都是一个事件循环组,一个组中可以有多个事件循环。每个事件循环的每次循环依次处理监听事件和任务队列。可以通过搜索 Netty 中 Reactor 模型的实现,和 Netty 的具体使用方式加深理解。(可以参考最下方的链接进一步了解。)
IO 模型参考链接:
https://juejin.cn/post/7070139350574432270
Netty 与 Reactor 模型实现参考链接:
https://juejin.cn/post/7070139350574432270(同上)
版权声明: 本文为 InfoQ 作者【Dinfan】的原创文章。
原文链接:【http://xie.infoq.cn/article/de451f30e6f1bfecca6230ef9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论