Reactor网络线程模型

news2024/9/24 22:53:17

目录

传统下网络服务模型 

事件监听模型

 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.coloradmin.cn/o/1271877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从登录测试谈测试用例

谈谈登录测试: 可能你会说,“用户登录”这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击“确 认”按钮,验证一下是否登录成功就可以了。的确,这构成了一…

联软 IT 安全运维管理软件反序列化漏洞复现

0x01 产品简介 联软科技持续十多年研发的联软IT安全运维管理软件,集网络准入控制、终端安全管理、BYOD设备管理、杀毒管理、服务器安全管理、数据防泄密、反APT攻击等系统于一体,通过一个平台,统一框架,数据集中,实现更…

PHP程序员必备技能:OSS云存储实现教程!

近些年来,云存储的应用越来越广泛,阿里云的OSS云存储服务也在国内市场中占据了一席之地。在此基础上,本文将分享如何使用PHP实现OSS云存储。 首先,我们需要在阿里云官网上注册一个账号并创建一个OSS存储空间。创建步骤在官方文档…

基于SSM的影视创作论坛设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

【复位与释放(亚稳态)模为60的BCD码计数器_2023.11.22】

复位与释放&#xff08;异步复位&#xff0c;同步释放&#xff09; 同步复位rst、同步置数load&#xff08;置数信号只有在时钟上升沿到来时才能生效&#xff09;、同步清零clr 同步复位&#xff1a; always(posedge clk) if(!rst_n) b<1’b0; else b<a; 同步复位信号rs…

【综述+自动流量分析A】New Directions in Automated Traffic Analysis

文章目录 论文简介摘要存在的问题论文贡献1. 整体架构2. nPrint3. nPrintML4. 任务 总结论文内容工具数据集可读的引用文献笔记参考文献 论文简介 原文题目&#xff1a;New Directions in Automated Traffic Analysis 中文题目&#xff1a;自动流量分析的新方向 发表会议&#…

SAP ABAP ALV-GRID-CLASS-SPLITTER一屏双页

ALV-GRID-CLASS-SPLITTER 备注说明&#xff1a; ALV屏幕分割&#xff0c;把一个ALV屏幕分成两个或多个屏幕 创建一个屏幕:0100,上面一个定制控件,名称: ALV_CONTAIN1 . 代码如下&#xff1a; PROCESS BEFORE OUTPUT.MODULE STATUS_0100.MODULE F_INIT_SPLITTER.MODULE F_CR…

IDEA中的Postman!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

Ruoyi-Vue或者Ruoyi-Cloud登录进去之后的第一个页面如何修改(即如何去掉首页或者如何修改首页)

其实大家如果看过最近的码云上的issues 就能知道这个问题的答案了。 我这里给出一下链接&#xff1a;https://gitee.com/y_project/RuoYi-Vue/issues/I60JIY 开始 第一步&#xff0c;把router/index.js里面关于首页的路由给注释掉或者删除掉&#xff0c;如图&#xff1a; 第…

提醒事项删除了怎么恢复?手机上记录的提醒事项删除怎么恢复

“糟糕&#xff01;我的提醒事项删除了几条&#xff0c;其中还有几条比较重要的内容&#xff0c;找不到回收站&#xff0c;也找不到最近删除的文件夹&#xff0c;单凭脑子回忆能想起来的内容少之又少&#xff0c;领导那边又催着要这份材料。”一大早&#xff0c;小刘就遇到这样…

数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

目录 一 Numpy 实现傅里叶变换 1 涉及的函数 2 实践 二 OpenCV 实现傅里叶变换 1 涉及的函数 2 实践 为了有效地和快速地对图像进行处理和分析&#xff0c;常常需要将原定义在图像空间的图像以某种形式转换&#xff08;正变换&#xff09;到另外一些空间&#xff0c;并利…

测试与管理 Quota

用myquota1创建一个大的文件测试 理论猜想&#xff1a;超过soft可以&#xff0c;但是超过hard就不行了&#xff0c;最大值就是hard&#xff0c;如果超过soft&#xff0c;过了17天不处理&#xff0c;最后限制值会被强制设置成soft。修改设置成hard值 切换测试用户&#xff0c;m…

阿里云国际短信业务网络超时排障指南

选取一台或多台线上的应用服务器或选取相同网络环境下的机器&#xff0c;执行以下操作。 获取公网出口IP。 curl ifconfig.me 测试连通性。 &#xff08;推荐&#xff09;执行MTR命令&#xff08;可能需要sudo权限&#xff09;&#xff0c;检测连通性&#xff0c;执行30秒。 m…

对数据页的理解

1.InnoDB 是如何存储数据的&#xff1f; 数据表中的记录是按照行来存储的&#xff0c;但是数据库的读取并不以「行」为单位&#xff0c;否则一次读取&#xff08;也就是一次 I/O 操作&#xff09;只能处理一行数据&#xff0c;效率会非常低。 因此&#xff0c;InnoDB 的数据是按…

Git——工作区管理

如何管理工作目录&#xff0c;以便用户可以更高效地新建提交。如何在处理工作区和暂存区文件的过程中修复错误&#xff0c;以及如何修复最近一次提交记录中的问题&#xff1b;同时还会了解到如何安全地使用暂存机制和多个工作目录处理工作流中的中断问题。 主要内容有以下几点…

黑马微信小程序学习笔记

小程序和普通网页的区别 1、运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 2、API不同 由于运行环境的不同&#xff0c;在小程序中无法调用DOM和BOM 的API&#xff08;因为这两个API是浏览器暴露出来的&#xff0c;微信环境没有&#xff09; 但是可以调用微信提…

华清远见嵌入式学习——C++——作业3

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Per { private:string name;int age;double *high;double *weight; public://有参构造函数Per(string n,int a,double h,double w):name(n),age(a),high(new double(h)),weight(ne…

统信UOS和vue.js的一个兼容问题

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 这事到现在说起还很奇怪&#xff0c;在UOS20&#xff08;硬件为华为鲲鹏服务器&#xff0c;arm架构&#xff0c;g8.3&#xff09;上部署uve.js&#xff0…

利润大增,MAU膝斩,谋求转型的新氧头顶“荆棘王冠”

撰稿|行星 来源|贝多财经 近日&#xff0c;医疗美容服务平台新氧科技&#xff08;NASDAQ:SY&#xff0c;下称“新氧”&#xff09;发布了2023年第三季度未经审计的财务业绩报告。 财报显示&#xff0c;新氧于2023年第三季度实现收入3.85亿元&#xff0c;同比增长19.2%&#x…

SS8844T四通道 1/2 H 桥驱动芯片发,替代A4979,DRV8844,L6288,MP6527

SS8844T 提供四个可独立控制的 1/2 H 桥启 动器。 它可被用于驱动两个 DC 电机、一个步进 电机、四个螺线管或者其它负载。 针对每个通道 的输出驱动器通道由在一个 1/2 H 桥配置中进行配 置的 N 通道功率 MOSFET 组成。 SS8844T 在每个桥的通道上提供高达 2.5A 峰…