Reactor网络线程模型

目录

传统下网络服务模型 

事件监听模型

 NIO核心概念

单线程Reactor模式 

多线程Reactor模式 

Kafka 的网络设计

主要概念 

类比思维理解

参考文章


传统下网络服务模型 

  • 线程太多
  • 无法处理大规模请求

事件监听模型

 NIO核心概念

nio是实现reactor模式的底层API代码 

单线程Reactor模式 

优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成;

缺点1:性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈;

缺点2:可靠性问题,线程意外终止,或进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障;
 

多线程Reactor模式 

整体工作流程如下:

  1. Reactor线程接受新的客户端连接,并通过Acceptor初始化连接。
  2. Reactor线程继续监听并分发读写事件,不执行任何业务逻辑计算。
  3. 对于需要处理的请求,Reactor将任务提交到线程池。
  4. 线程池中的工作线程按需从队列中取出任务,执行解码、计算和编码操作。
  5. 一旦响应准备好,相关的数据可以返回给Reactor线程,由它发送回客户端。 

链接: Scalable IO in Java.pdf 

Kafka 的网络设计

Kafka 的网络设计和 Kafka 的调优有关,这也是为什么它能支持高并发的原因: 

主要概念 

Kafka的网络设计采用了Reactor模式,这是一种高效处理并发网络连接的模式。在Reactor模式中,有几个关键的组件:

  1. Acceptor

    • 负责处理新的网络连接请求。
    • 通常运行在单独的线程上,监听指定的端口。
    • 一旦有新的连接请求,它会接受连接并创建一个socket channel。
  2. Processor

    • 处理来自socket channel的I/O事件(如读写操作)。
    • Processor通常维护一个或多个socket channels,并使用非阻塞I/O来同时服务多个连接。
  3. Socket Channel

    • 表示与客户端之间的网络连接。
    • 在非阻塞模式下,socket channel可以在没有I/O操作可以执行时返回,这允许单个线程高效处理多个连接。
  4. 请求队列(Request Queue)响应队列(Response Queue)

    • 网络线程接收数据后,会把请求放入请求队列,由后台的I/O线程(或请求处理器)进行处理。
    • 处理完的响应被放入响应队列,等待网络线程读取并发送回客户端。

在Kafka中,这个模型被用来实现高效的网络通信。网络线程(Processor)只负责网络I/O的读写,实际的消息处理逻辑(例如消息的解码、提交到日志等)由其他线程处理,从而实现了计算和I/O的解耦,提高了整体的性能和可伸缩性。

具体到Kafka的实现,它使用了一个或多个网络线程来处理所有网络活动,每个线程可以处理多个连接。这些线程不断地检查socket channels,看是否有新的数据可读或是否可以写入数据到网络。使用非阻塞I/O确保了单个线程可以有效地处理多个网络请求,而不会因为某个慢速的连接而阻塞。

我们可以看到Acceptor和Processor的逻辑分工,以及请求和响应在系统中如何流动。请求被放入队列,处理器从队列中拉取请求进行处理,然后处理完的响应被放回另一个队列等待发送。这个设计允许Kafka的网络层高效地处理成千上万的并发连接。

类比思维理解

想象你在一个快餐店,这个快餐店的运作非常类似于Reactor网络线程模型:

  1. Acceptor(接待员):

    • 顾客一进门,接待员负责迎接并指引顾客到点餐台。
    • 在Reactor模型中,Acceptor相当于是接受新连接的组件,一旦有新的网络连接,它接受连接并创建一个通信通道。
  2. Processor(点餐台工作人员):

    • 点餐台的工作人员负责处理顾客的订单。他们听取顾客的要求,记录订单,然后将订单传递给厨房。
    • 在Reactor模型中,Processor处理来自客户端的I/O事件,比如读取数据(接受订单)和写入数据(发送订单到厨房)。
  3. Socket Channel(订单流转路径):

    • 订单从点餐台到厨房再到顾客手中的路径。
    • 在Reactor模型中,Socket Channel是客户端和服务端通信的通道。
  4. 请求队列(订单队列):

    • 订单被记录在订单队列中,等待厨房处理。
    • 在Kafka的网络模型中,请求队列保存了待处理的网络请求。
  5. 厨房(业务处理器):

    • 厨房的工作人员根据订单制作食物。
    • 在Reactor模型中,业务逻辑处理器执行类似的角色,它处理业务逻辑并准备响应。
  6. 响应队列(成品出餐区):

    • 制作完成的食物被放在成品区,等待服务员送到顾客手中。
    • 在Reactor模型中,响应队列用于存放处理完毕的数据,等待发送回客户端。

在这个快餐店模型中,点餐台工作人员(Processor)可以同时处理多个顾客的订单(非阻塞I/O),并且不需要自己做饭(业务逻辑处理)。这种工作流程让快餐店(服务器)可以高效地服务众多顾客(并发连接)。当食物准备好后,服务员(网络线程)将其送到顾客手中(发送响应)。这样的模型允许快餐店以最小的人力高效运作,类似地,Reactor模型使得服务器能够以最小的资源高效处理大量并发网络请求。

所以这就是一个加强版的 Reactor 网络线程模型。

参考文章

Reactor 线程模型_reactor模型_HoryC的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236213.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3+element-plus+vue-cropper实现裁剪图片上传

1.vue3element-plusvue-cropper实现裁剪图片 element-UI官网element-plus官网vue-croppervue3使用vue-cropper安装&#xff1a;npm install vue-croppernext 2.vue-cropper插件&#xff1a; <vue-cropper :img"option.img" /><script setup>import {reac…

Pycharm中使用matplotlib绘制动态图形

Pycharm中使用matplotlib绘制动态图形 最终效果 最近用pycharm学习D2L时发现官方在jupyter notebook交互式环境中能动态绘制图形&#xff0c;但是在pycharm脚本环境中只会在最终 plt.show() 后输出一张静态图像。于是有了下面这段自己折腾了一下午的代码&#xff0c;用来在pych…

(项目已开源)社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 slider滑块 和 box3 歌词滚动区域 进行联动

(项目已开源)社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 slider滑块 和 box3 歌词滚动区域 进行联动 链接&#xff1a;https://pan.baidu.com/s/16lpEW6L5jrHfhsG7EXocLw?pwdkryy 提取码&#xff1a;kryy <!--社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 s…

Vue的Nuxt项目部署在服务器,pm2动态部署和npm run build静态部署

Nuxt项目的部署有两种方式&#xff0c;一种是静态部署&#xff0c;一种是动态部署 静态部署需要关闭项目的ssr功能&#xff0c;动态部署则不需关闭&#xff0c;所以怎么部署项目就看你用不用ssr功能了 。 1.静态部署 先说静态部署&#xff0c;很简单&#xff0c;只需要在nuxt…

蓝桥杯每日一题2023.11.30

题目描述 九数组分数 - 蓝桥云课 (lanqiao.cn) 题目分析 此题目实际上是使用dfs进行数字确定&#xff0c;每次循环中将当前数字与剩下的数字进行交换 eg.1与2、3、4、、、进行交换 2与3、4、、、进行交换 填空位置将其恢复原来位置即可&#xff0c;也就直接将其交换回去即可…

OpenCV中八种不同的目标追踪算法

引言 目标跟踪作为机器学习的一个重要分支&#xff0c;加之其在日常生活、军事行动中的广泛应用&#xff0c;受到极大的关注。在AI潮流中&#xff0c;大家对于深度学习&#xff0c;目标跟踪肯定都会有过接触了解&#xff1a;在GPU上通过大量的数据集训练出自己想使用的垂直场景…

Open3D 最小二乘拟合二维直线(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 平面直线的表达式为: y = k x + b

如何配置mybatis中mapper对应关系,解决mybatis报错:Invalid bound statement (not found):

先看一下报错信息&#xff1a; Invalid bound statement&#xff1a;意思是无效的绑定语句 原因就是&#xff1a;在使用mybatis时mapper.xml没有和mapper接口对应起来 解决方式 第一种&#xff1a; 将mapper.xml和mapper接口放在同一位置 在pom中配置&#xff1a; <reso…

计网Lesson5 - MAC 地址与 ARP

文章目录 M A C MAC MAC 地址1. M A C MAC MAC 地址的格式 2. M A C MAC MAC 地址的获取3. A R P ARP ARP 协议4. A R P ARP ARP 缓存5. R A R P RARP RARP M A C MAC MAC 地址 1. M A C MAC MAC 地址的格式 每个网卡都有一个 6 6 6 字节的 M A C MAC MAC 地址 M A C…

分支和循环

通常来说&#xff0c;C语言是结构化的程序设计语言&#xff0c;这里的结构包括顺序结构、选择结构、循环结构&#xff0c;C语言能够实现这三种结构&#xff0c;如果我们仔细分析&#xff0c;我们日常生活中所见的事情都可以拆分为这三种结构或者它们的组合。 下面我会仔细讲解我…

计算机软件的分类

以功能进行分类&#xff0c;计算机软件通常可以分为系统软件和应用软件两大类。 系统软件&#xff1a;系统软件是计算机运行和管理的基本软件&#xff0c;包括操作系统、驱动程序、系统工具和服务程序等。操作系统是系统软件的核心&#xff0c;负责管理计算机的硬件资源、提供用…

数字图像处理(实践篇)十四 图像金字塔

目录 一 图像金字塔 二 涉及的函数 三 实践 一 图像金字塔 在某些情况下&#xff0c;需要处理不同分辨率的&#xff08;相同&#xff09;图像。比如&#xff0c;在图像中搜索某些目标&#xff08;比如人脸&#xff09;的时候&#xff0c;不确定该目标在所述图像中会以多大的…