文章目录

  • 定义
  • 传统网络交互方式
  • Reactor 模型组成
  • Netty中`Reactor`模型的实现
    • Reactor 单线程模式
    • 非主从Reactor模式(单Reactor多线程模型)
    • 主从Reactor多线程模式

定义

Reactor模型就是网络服务器用来处理高并发网络IO请求的一种编程模型。

传统网络交互方式

一般我们网络交互都是基于客户端服务端模式,然后就会有如下事件

  1. 当一个客户端和服务器要进行交互时,首先客户端会向服务端发送连接请求,和服务端建立连接。这就对应服务的的连接事件
  2. 无论客户端给服务端发送读或写请求,服务端都需要从客户端读取请求内容,所以这里读取客户端的请求内容就对应服务端的读事件
  3. 当连接建立完后,客户端会给服务器发送读请求,读取数据。服务端在处理读请求的时候后,需要向客户端返回(写)数据,这就对应了服务端的写事件

所以一般的网络请求就包含如上三种事件:连接事件、写事件、读事件

Reactor 模型组成

Reactor 模型中一般有三种角色。这三种角色分别与上面网络请求中的三种事件,即

  • Reactor -> 监听和分配事件
  • acceptor -> 连接事件
  • handler -> 读、写事件

本来看似 只需要acceptorhandler这两种角色就可以对应三毛的三种事件,为什么会多出来了Reactor这个角色呢。因为在高并发场景中,连接事件、读写事件会同时发生,所以我们需要一个角色专门去监听和分配事件,这个职责就落到了reactor头上来了。下面图片就三者的关系

在理解了Reactor模型后,我们再来聊聊Netty中Reactor模型的实现

Netty中Reactor模型的实现

Reactor 单线程模式

     EventLoopGroup eventLoopGroup = new NioEventLoopGroup(1);ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(eventLoopGroup);

可以看到从连接的建立,并创建handler来处理后续的各种业务时间,都是一个线程执行所有事情

缺点很明显:

  1. 在请求过多时,会无法支撑。因为只有一个线程,无法发挥多核CPU性能
  2. 一旦某个Handler发生阻塞,服务端就完全无法处理其他连接事件

非主从Reactor模式(单Reactor多线程模型)

     EventLoopGroup eventLoopGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(eventLoopGroup);

这里与上面的Reactor 单线程模式相比,我们没有设置NioEventLoopGroup的线程数,如果跟源码会发现如果没有设置线程数默认是CPu核数的2倍的线程数

优点:

​ 1. 使用了多线程去处理业务和连接,不会因为某个业务处理阻塞导致服务端无法处理请求

缺点:

1. 连接事件和业务处理没有分开,不够解耦
2. 可能因为业务的处理效率影响连接的处理

主从Reactor多线程模式

     EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup);

主从Reactor多线程模式中我们使用了两个NioEventLoopGroup线程池,将连接和业务处理分开了,用了一个专门的线程池去处理连接请求。这也就对应多Reactor多线程模型,也是目前最主流的使用方式

简单深入理解高性能网络编程(Netty)中的Reactor模型(图文+代码)相关推荐

  1. 什么流读取MultipartFile_深入理解并运用Node中的IO模型流

    在 NodeJs 中,流随处可见,读/写文件流,HTTP请求/返回流,stdin/stdout流.理解并运用好流会让你的Node更具力量. Stream lib/_stream_readable.js ...

  2. 详解视频中动作识别模型与代码实践

    摘要:本案例将为大家介绍视频动作识别领域的经典模型并进行代码实践. 本文分享自华为云社区<视频动作识别>,作者:HWCloudAI.实验目标 通过本案例的学习: 掌握 C3D 模型训练和模 ...

  3. 编程界中的智能输入法,用上之后越来越喜欢

    在搜狗智能输入法面世的时候,用了一段时间之后,发现它真的很智能,对于常用的语言的片段都记录了下来,而且智能的把常用的文字排到第一位. 在我开始写程序时,我就常常在想,如果在编程中也有类似搜狗智能输入法 ...

  4. Java游戏服务器系列:传统的BIO(OIO)、NIO与Netty中的BIO(OIO)、NIO

    BIO .NIO .OIO BIO就是OIO,BIO是阻塞IO模型(Block-I/O) NIO是非阻塞IO模型(Non-Block I/O), 有人将NIO称作(New-I/O),所以也将BIO称之 ...

  5. 为什么说Netty是性能之王,因为它用了 Reactor 模型啊

    点击关注公众号,Java干货及时送达 本文将介绍基于进程/线程模型,服务器如何处理请求.值得说明的是,具体选择线程还是进程,更多是与平台及编程语言相关. 例如 C 语言使用线程和进程都可以(例如 Ng ...

  6. 五分钟快速理解 Reactor 模型

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 本文将介绍基于进 ...

  7. 一文聊透Netty核心引擎Reactor的运转架构

    本系列Netty源码解析文章基于 4.1.56.Final版本 本文笔者来为大家介绍下Netty的核心引擎Reactor的运转架构,希望通过本文的介绍能够让大家对Reactor是如何驱动着整个Nett ...

  8. 详解Dart中如何通过注解生成代码

    简介:详解dart与java注解生成代码异同点 作者:闲鱼技术-龙湫 1.背景 最近在项目中使用到了Dart中的注解代码生成技术,这跟之前Java中APT+JavaPoet生成代码那套技术还是有一些不 ...

  9. Jena 简介:通过 Jena Semantic Web Framework 在 Jave 应用程序中使用 RDF 模型

    简介: RDF 越来越被认为是表示和处理半结构化数据的一种极好选择.本文中,Web 开发人员 Philip McCarthy 向您展示了如何使用 Jena Semantic Web Toolkit,以 ...

最新文章

  1. Talk is cheap, show me the code - 用 github 数据辅助你完善简历
  2. 雨中赶班车 2019-12-19
  3. Ubuntu 12.04 x64 下安装 GStreamer+FFmpeg+Opencv
  4. matlab用高斯消元法解线性方程组,用matlab利用高斯消元法求解线性方程组
  5. VS Code编译Python
  6. 二十六岁,博士考入团中央选调生,前途如何?
  7. 荣耀30s刷鸿蒙,荣耀终于放出大招!4部荣耀旗舰可升级鸿蒙,网友:终于等到了...
  8. QQ解封地址大全集合
  9. 今日分享idea精彩好看的主题+网站地址
  10. python爬取百度迁徙动态图_python爬虫动态爬取百度迁徙
  11. 链路冗余的解决和故障的备用方案
  12. 通信算法之三十五:GMSK/MSK/CPFSK/CPM/FSK仿真链路
  13. 科普:千兆级LTE技术深度解析
  14. 集装箱编号校验码规则(JavaScript版本)
  15. 如何将pdf转为word使用?
  16. ChromeDriver与Chrome版本对应关系及下载链接
  17. 解决金山打字通不能缩小窗口问题
  18. 【信号与系统】(二)信号与系统概述——基本信号
  19. 网易“四位一体”安全防御体系建设
  20. 软件设计师---UML

热门文章

  1. Spring Cloud系列勘误
  2. Python Pandas库简要学习
  3. Monthly Expense (二分初级典例)
  4. pointconv pytorch modelnet40 点云分类结果可视化
  5. AE493 10组卡通烟雾流体图形动画彩色文字字幕动画转场效果ae模板
  6. Golang获取命令行参数的方式
  7. 2022牛客多校十 E-Reviewer Assignment(匈牙利算法)
  8. 经不住似水流年,逃不过此间少年
  9. Hog特征提取原理过程细节
  10. js 走马灯效果 无缝 不断实现