Netty 的非阻塞 I/O 的实现关键是基于 I/O 复用模型,这里用 Selector 对象表示:
文章插图
Nonblocking I/O
Netty 的 IO 线程 NioEventLoop 由于聚合了多路复用器 Selector,可以同时并发处理成百上千个客户端连接 。
当线程从某客户端 Socket 通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务 。
线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道 。
由于读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起 。
一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这从根本上解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升 。
基于 Buffer
传统的 I/O 是面向字节流或字符流的,以流式的方式顺序地从一个 Stream 中读取一个或多个字节, 因此也就不能随意改变读取指针的位置 。
在 NIO 中,抛弃了传统的 I/O 流,而是引入了 Channel 和 Buffer 的概念 。在 NIO 中,只能从 Channel 中读取数据到 Buffer 中或将数据从 Buffer 中写入到 Channel 。
基于 Buffer 操作不像传统 IO 的顺序操作,NIO 中可以随意地读取任意位置的数据 。
线程模型
数据报如何读取?读取之后的编解码在哪个线程进行,编解码后的消息如何派发,线程模型的不同,对性能的影响也非常大 。
事件驱动模型
通常,我们设计一个事件处理模型的程序有两种思路:
轮询方式,线程不断轮询访问相关事件发生源有没有发生事件,有发生事件就调用事件处理逻辑 。
事件驱动方式,发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻辑处理事件 。事件驱动方式也被称为消息通知方式,其实是设计模式中观察者模式的思路 。
以 GUI 的逻辑处理为例,说明两种逻辑的不同:
轮询方式,线程不断轮询是否发生按钮点击事件,如果发生,调用处理逻辑 。
事件驱动方式,发生点击事件把事件放入事件队列,在另外线程消费的事件列表中的事件,根据事件类型调用相关事件处理逻辑 。
这里借用 O'Reilly 大神关于事件驱动模型解释图:
文章插图
事件驱动模型
主要包括 4 个基本组件:
事件队列(event queue):接收事件的入口,存储待处理事件 。
分发器(event mediator):将不同的事件分发到不同的业务逻辑单元 。
事件通道(event channel):分发器与处理器之间的联系渠道 。
事件处理器(event processor):实现业务逻辑,处理完成后会发出事件,触发下一步操作 。
可以看出,相对传统轮询模式,事件驱动有如下优点:
可扩展性好,分布式的异步架构,事件处理器之间高度解耦,可以方便扩展事件处理逻辑 。
高性能,基于队列暂存事件,能方便并行异步处理事件 。
Reactor 线程模型
Reactor 是反应堆的意思,Reactor 模型是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式 。
服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor 模式也叫 Dispatcher 模式,即 I/O 多了复用统一监听事件,收到事件后分发(Dispatch 给某进程),是编写高性能网络服务器的必备技术之一 。
Reactor 模型中有 2 个关键组成:
Reactor,Reactor 在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对 IO 事件做出反应 。它就像公司的电话接线员,它接听来自客户的电话并将线路转移到适当的联系人 。
Handlers,处理程序执行 I/O 事件要完成的实际事件,类似于客户想要与之交谈的公司中的实际官员 。Reactor 通过调度适当的处理程序来响应 I/O 事件,处理程序执行非阻塞操作 。
文章插图
Reactor 模型
取决于 Reactor 的数量和 Hanndler 线程数量的不同,Reactor 模型有 3 个变种:
单 Reactor 单线程 。
单 Reactor 多线程 。
主从 Reactor 多线程 。
可以这样理解,Reactor 就是一个执行 while (true) { selector.select(); …} 循环的线程,会源源不断的产生新的事件,称作反应堆很贴切 。
推荐阅读
- 常用架构模式
- 抖音群控原理是什么?
- 架构:缓存设计
- SSH远程登录原理是什么?
- 路由器与交换机的工作原理
- 浅谈Linux系统中的7种运行级别及其原理
- 3D电影的原理
- 下象棋要掌握的布局原理 怎样下象棋
- 喝生姜红茶减肥好不好 生姜红茶减肥原理和注意事项
- Nacos配置中心集群原理及源码分析