菜鸡学习netty源码(三)—— Reactor 模型

1.概述

我们先进行理解一下Reactor模型,知道什么是Reactor模型,它有什么特别之处。我们先来简单介绍一下这个Reactor模型。

Reactor模型的核心思想:

就是将所关注的I/O事件进行注册到一个多路复用器上,一旦有I/O事件的发生,将事件进行分发到对应的事件处理器中,执行I/O事件对应的函数。里面主要包含几个核心组件:

  1. 分发器:这个是Reactor模型的中心组件,所有的I/O事件以及其处理器都要在这里进行注册,同时它还拥有一个多路复用器,在启动的时候,会阻塞多路复用器以监听注册的I/O事件,当有I/O事件到达的时候,会进行通知分发器,分发器会进行调用之前注册的事件处理器,进行处理对应的I/O事件
  2. 多路复用器:监听对应的I/O事件,用以通知分发器
  3. 事件处理器:事件处理器会进行注册到分发器中,当分发器得到了多路复用器的事件通知后,会回调这些事件处理器进行处理对应的事件信息
  4. 事件:基本上可以认为就是I/O事件

Rector模型有3中模型的实现:单Reactor单线程模型,单Reactor多线程模型,多Reactor多线程模型。

2.单Reactor单线程模型

可以看到有多个客户端连接到Reactor,Reactor内部有一个dispatch(分发器)。有连接请求后,Reactor会通过dispatch把请求交给Acceptor进行处理,有IO读写事件之后,又会通过dispatch交给具体的Handler进行处理。

此时一个Reactor既然负责处理连接请求,又要负责处理读写请求,这样的话就会出现一个问题:Reactor只能处理一个请求,在这个请求处理的过程,别的请求只能进行一个等待的过程。

3.单Reactor多线程模型

相对比第一种单线程的模式来讲,这种多线程的模式在事件处理上使用了多线程的模式,把事件交给线程池来进行处理,减少Reactor的性能开销。这样就可以实现一个服务端可以同时为N个客户端进行服务了。

这个模型看起来已经很不错了,但是还有一些缺点:一个Reactor还是既然负责连接请求,又要负责读写请求,连接请求是很快的,而且一个客户端一般只要连接一次就可以了,但是会发生很多次写请求,如果可以有多个Reactor,其中一个Reactor负责处理连接事件,多个Reactor负责处理客户端的写事件就好了。

4.多Reactor多线程模型

在这种多Reactor多线程模型,有一个主的Reactor,专门进行监听ACCEPT事件,然后有多个Reactor,监听读写事件。

完整的流程如下:

  1. mainReactor 负责监听 ServerSocketChannel ,用来处理客户端新连接的建立,并将建立的客户端的 SocketChannel 指定注册给 subReactor 。
  2. subReactor 维护自己的 Selector ,基于 mainReactor 建立的客户端的 SocketChannel 多路分离 IO 读写事件,读写网络数据。对于业务处理的功能,另外扔给 worker 线程池来完成。

5.参考

  1. 【NIO系列】------之Reactor模型 - wier的个人空间 - OSCHINA - 中文开源技术交流社区
  2. reactor模型 | Essviv
  3. Reactor模型详解-CSDN博客
相关推荐
charlie1145141917 小时前
现代嵌入式C++教程:C++98——从C向C++的演化(2)
c语言·开发语言·c++·学习·嵌入式·教程·现代c++
速易达网络7 小时前
基于Java TCP 聊天室
java·开发语言·tcp/ip
Rousson7 小时前
硬件学习笔记--93 静电防护方案(电阻、磁珠、电感、TVS等)
笔记·单片机·学习
沿着路走到底7 小时前
JS事件循环
java·前端·javascript
思成不止于此7 小时前
【MySQL 零基础入门】事务精讲(二):ACID 特性与并发问题
数据库·笔记·学习·mysql
爱笑的眼睛118 小时前
超越 `cross_val_score`:深度解析Scikit-learn交叉验证API的架构、技巧与陷阱
java·人工智能·python·ai
Wang's Blog8 小时前
Kafka: 消费者核心机制
分布式·kafka
happyhappy没有句号8 小时前
嵌入式单片机一套通关学习笔记
笔记·单片机·嵌入式硬件·学习
悠哉悠哉愿意8 小时前
【嵌入式学习笔记】工程模板建立
笔记·嵌入式硬件·学习
d111111111d8 小时前
STM32外设基地址与寄存器偏移地址的深度解析
笔记·stm32·单片机·嵌入式硬件·学习