菜鸡学习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博客
相关推荐
小熊officer12 分钟前
Nginx学习
运维·学习·nginx
秋邱15 分钟前
价值升维!公益赋能 + 绿色技术 + 终身学习,构建可持续教育 AI 生态
网络·数据库·人工智能·redis·python·学习·docker
Three~stone21 分钟前
Matlab2025b的安装教程(附安装包和密钥破解文件)
学习·mysql·持续部署
用户37215742613523 分钟前
使用 Java 删除 Word 文档中的水印
java
艾斯比的日常23 分钟前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
空空kkk35 分钟前
MyBatis——代理Dao方式的增删改查操作
java·数据库·mybatis
爱学习的大牛12336 分钟前
如何系统学习网络渗透测试:从入门到精通的完整指南
网络·学习
拾忆,想起40 分钟前
Dubbo分组(Group)使用指南:实现服务接口的多版本管理与环境隔离
分布式·微服务·性能优化·架构·dubbo
Seven971 小时前
线性数据结构
java
带刺的坐椅1 小时前
Solon 不依赖 Java EE 是其最有价值的设计!
java·spring·web·solon·javaee