菜鸡学习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博客
相关推荐
接着奏乐接着舞几秒前
大模型开发 agent 知识库
java
xuhaoyu_cpp_java11 分钟前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
plainGeekDev37 分钟前
kapt 替换为 KSP
android·java·kotlin
蜡台1 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
程序员天天困1 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH1 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
Eira-Z3 小时前
git(持续学习中...)
git·学习
子非鱼94273 小时前
07-Flutter 鸿蒙实战 07:故事集列表与缓存设计
学习·flutter·缓存·华为·harmonyos
怎么比啊都是大神3 小时前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫3 小时前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java