菜鸡学习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博客

相关推荐

  1. 学习netty(二)——BootStrap启动

    2024-05-03 22:08:02       11 阅读
  2. Redis Reactor事件驱动模型

    2024-05-03 22:08:02       46 阅读
  3. Netty中的Reactor模型实现

    2024-05-03 22:08:02       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-03 22:08:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-03 22:08:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-03 22:08:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-03 22:08:02       18 阅读

热门阅读

  1. 【MyBatisPlus 分页插件解析】

    2024-05-03 22:08:02       9 阅读
  2. 静态库和动态库

    2024-05-03 22:08:02       9 阅读
  3. 项目经理-简历描述

    2024-05-03 22:08:02       8 阅读
  4. python实现的堆排序

    2024-05-03 22:08:02       11 阅读
  5. 【Python快速上手(十一)】

    2024-05-03 22:08:02       10 阅读
  6. 牛客面试1

    2024-05-03 22:08:02       10 阅读
  7. QT-this关键字

    2024-05-03 22:08:02       9 阅读
  8. 设计模式:建造者模式

    2024-05-03 22:08:02       10 阅读
  9. Visual Studio C++ 的一个简单示例

    2024-05-03 22:08:02       10 阅读
  10. 模拟退火算法matlab代码

    2024-05-03 22:08:02       12 阅读
  11. 【软测学习笔记】MySQL入门Day02

    2024-05-03 22:08:02       13 阅读
  12. 算法===二分查找

    2024-05-03 22:08:02       12 阅读