菜鸡学习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博客
相关推荐
Include everything15 分钟前
Rust学习笔记(三)|所有权机制 Ownership
笔记·学习·rust
AAA修煤气灶刘哥16 分钟前
Java+AI 驱动的体检报告智能解析:从 PDF 提取到数据落地全指南
java·人工智能·后端
wxy31926 分钟前
嵌入式LINUX——————TCP并发服务器
java·linux·网络
杜子不疼.44 分钟前
《Python学习之文件操作:从入门到精通》
数据库·python·学习
★YUI★1 小时前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
微小的xx1 小时前
java + html 图片点击文字验证码
java·python·html
mask哥1 小时前
详解flink java基础(一)
java·大数据·微服务·flink·实时计算·领域驱动
克拉克盖博1 小时前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
DashVector2 小时前
如何通过Java SDK分组检索Doc
java·数据库·面试
livemetee2 小时前
Flink2.0学习笔记:Flink服务器搭建与flink作业提交
大数据·笔记·学习·flink