【分布式理论8】分布式调用之:四种IO模型

文章目录

  • 一. 四种IO模型
    • 1. 同步阻塞 IO(Blocking IO)
    • 2. 同步非阻塞 IO(Non-blocking IO)
    • 3. IO 多路复用(IO Multiplexing)
    • 4. 异步 IO(Asynchronous IO)在 RPC 中的作用
    • 5. 总结
  • 选择多路复用或异步IO

在【分布式理论7】分布式调用之:服务间的(RPC)远程调用 我们知道了RPC(Remote Procedure Call,远程过程调用)过程中数据会进行多次的复制和传递,所以IO 模型的选择对系统的性能、吞吐量和响应时间有重要影响。不同的 IO 模型适用于不同的 RPC 场景,接下来我们具体分析下这四种IO模型。

一. 四种IO模型

1. 同步阻塞 IO(Blocking IO)

在同步阻塞 IO 模型下,RPC 客户端或服务器在进行网络通信时,会一直阻塞等待数据返回,这种方式的优点是实现简单,代码逻辑清晰,但缺点是效率较低,特别是在高并发情况下,阻塞会导致线程资源浪费,影响吞吐量。

工作原理

  1. 应用程序在用户空间向服务器发送请求。
  2. 内核接收请求,并等待数据从网络到达。
  3. 数据到达后,先存入内核缓冲区
  4. 内核将数据复制到应用缓冲区
  5. 复制完成后,应用程序才能继续执行数据处理。

在整个过程中,应用程序在数据未到达前一直处于等待状态,无法执行其他任务。

在这里插入图片描述

 

比喻:饭店点餐

同步阻塞 IO 就像在饭店点餐后,客人一直坐在座位上等菜上桌,期间什么也不做,直到菜全部端上来后才开始吃饭。

 

2. 同步非阻塞 IO(Non-blocking IO)

在同步非阻塞 IO 模型下,RPC 服务器在处理请求时,不会一直等待数据返回,而是会定期轮询内核数据是否可用,这种方式可以让在同步非阻塞 IO 模型下,RPC 服务器在处理请求时,不会一直等待数据返回,而是会定期轮询内核数据是否可用,这种方式可以让 RPC 服务器在等待数据的同时,执行其他任务,提高资源利用率。在等待数据的同时,执行其他任务,提高资源利用率。

工作原理

  1. 应用程序向服务器发起请求。
  2. 内核检查数据是否准备好。
    • 如果数据还未准备好,内核立刻返回一个错误信息。
    • 如果数据准备好,数据存入内核缓冲区
  3. 应用程序周期性地轮询内核,检查数据是否可用。
  4. 数据准备好后,应用程序读取数据,并将其从内核缓冲区复制到应用缓冲区
  5. 复制完成后,应用程序执行数据处理。

在数据未准备好时,应用程序不会阻塞,而是可以执行其他任务。

在这里插入图片描述

比喻:饭店点餐

同步非阻塞 IO 就像客人点餐后,可以玩手机、聊天,每隔一段时间问服务员“菜好了没有?”,如果还没好就继续做自己的事,直到菜准备好再吃饭。

缺点: 1. 轮询会造成 CPU 资源浪费,影响系统整体性能、2. 如果轮询间隔设置不合理,可能会导致 RPC 响应延迟。

 

3. IO 多路复用(IO Multiplexing)

IO 多路复用(如 selectpollepoll)是 RPC 服务器常用的 IO 处理方式。通过一个复用器(如 epoll),服务器可以管理多个 RPC 连接(即监听多个IO请求),并且只在数据到达时才进行读取和处理(how),而不需要不断轮询,提高了系统吞吐量。

工作原理

  1. 复用器(Selector) 进程负责监听多个网络请求的 IO 状态。
  2. 用户进程调用复用器,并进入阻塞状态
  3. 复用器监听多个 IO 连接,一旦有某个连接的数据准备好,它就会通知对应的用户进程。
  4. 用户进程读取数据,并将其从内核缓冲区复制到应用缓冲区
  5. 复制完成后,应用程序执行数据处理。

在这里插入图片描述

比喻:饭店点餐

IO 多路复用就像一群人一起吃饭,他们的订单由同一个传菜员负责。传菜员会统一管理所有人的订单,一旦某道菜做好,就立刻送给对应的客人,而不是每个客人自己反复去问“我的菜好了没?”

优缺点:

类别描述
优点高并发适用:适合同时处理大量连接,如 RPC 服务器、微服务网关等。
线程数减少:可以使用少量线程管理大量连接,降低 CPU 和内存消耗。
成熟稳定epoll 在 Linux 下表现优秀,广泛应用于 Netty、Nginx、Redis 等高性能网络程序。
缺点仍然需要数据拷贝:数据到达内核缓冲区后,需要用户态进程主动读取,仍有一定的 CPU 消耗。
适用于 I/O 密集型:当业务计算量较大时,可能会成为瓶颈。

 
适用场景

  • 高并发 RPC 服务器(如 Netty + gRPC)。
  • HTTP 服务器(如 Nginx、Tomcat)。
  • 数据库代理(如 MySQL Proxy)。
  • 消息队列(如 Kafka、RabbitMQ)。

 

4. 异步 IO(Asynchronous IO)在 RPC 中的作用

异步 IO(AIO)模式下,RPC 调用不会阻塞或轮询,而是直接注册回调函数,当数据准备好时,由内核通知应用程序进行处理。这种模式能最大化提高 IO 效率,但实现较复杂,需要支持异步编程模型(如 Java 的 NIOCompletableFuture)。

适用场景

  • 高吞吐 RPC 框架(如 Dubbo、gRPC 的异步模式)。
  • 高并发流式数据处理(如 Kafka、Flink)。
  • 事件驱动架构(EDA)(如 Node.js)。
  • 微服务异步通信(如 Kafka + Spring WebFlux)。

异步 IO(Asynchronous IO)的优缺点

类别描述
优点真正的异步处理:不需要应用进程主动轮询或读取数据,由内核完成数据拷贝后直接通知用户态,减少 CPU 开销。
适用于 CPU 密集型:在计算任务较多的场景下,异步 IO 可让计算与 IO 并行,提高系统吞吐量。
缺点实现复杂度高:需要采用异步编程模型,如 FuturePromiseCallback,可能导致代码可读性变差(如回调地狱)。
操作系统支持有限:虽然 Linux 提供了 io_uring,但异步 IO 生态尚未完全成熟,部分应用仍倾向使用 IO 多路复用。

 

5. 总结

IO 模型是否阻塞是否轮询适用场景
同步阻塞 IO阻塞简单的单线程应用
同步非阻塞 IO非阻塞需要轮询资源利用率较高,但增加 CPU 开销
IO 多路复用阻塞(等待事件)复用器代替轮询适用于高并发场景,如 RPC、服务器编程
异步 IO非阻塞否(注册回调函数)适合超高并发、低延迟 RPC 需求,实现复杂,但性能最佳。

 

选择多路复用或异步IO

对比项IO 多路复用异步 IO(AIO)
并发能力高(支持大量连接)更高(IO 与计算可并行)
CPU 开销适中(事件驱动但仍需读取数据)低(数据直接拷贝到用户缓冲区)
代码复杂度低(事件模型较成熟)高(回调、异步编程)
适用场景高并发网络服务器、RPC、数据库代理高吞吐 RPC、流式处理、大量 I/O 任务
操作系统支持epoll(Linux)、kqueue(BSD)io_uring(Linux),支持度较低
  1. 高并发场景:优先 IO 多路复用epoll),如 gRPC、Netty。
  2. 低延迟、极高吞吐:优先 异步 IO,如 Dubbo 异步 RPC。
  3. 复杂业务逻辑:建议 IO 多路复用,避免回调地狱。
  4. 计算与 IO 并行:异步 IO 更优,如 AI 推理、流式计算任务。

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

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

相关文章

元宇宙中的隐私与数据保护:Facebook 的挑战与机遇

随着数字技术的飞速发展,元宇宙(Metaverse)正逐渐成为未来互联网的新舞台。Meta,作为这一领域的先行者,正面临着隐私与数据保护的双重挑战。本文将探讨 Meta 在元宇宙中的隐私与数据保护问题,并分析其可能的…

Word中Ctrl+V粘贴报错问题

Word中CtrlV粘贴时显示“文件未找到:MathPage.WLL”的问题 Word的功能栏中有MathType,但无法使用,显示灰色。 解决方法如下: 首先找到MathType安装目录下MathPage.wll文件以及MathType Commands 2016.dotm文件,分别复…

Stability AI 联合 UIUC 提出单视图 3D 重建方法SPAR3D,可0.7秒完成重建并支持交互式用户编辑。

Stability AI 联合 UIUC 提出一种简单而有效的单视图 3D 重建方法 SPAR3D,这是一款最先进的 3D 重建器,可以从单视图图像重建高质量的 3D 网格。SPAR3D 的重建速度很快,只需 0.7 秒,并支持交互式用户编辑。 相关链接 论文&#xf…

Spring Cloud 04 - 负载均衡和外部服务访问

Ribbon & Feign 文章目录 Ribbon & Feign一:Ribbon负载均衡1:介绍 2:ribbon的五大核心组件二:Feign外部接口访问1:Feign概述2:Feign vs OpenFeign3:使用示例3.1:注解支持3.2…

力扣--链表

相交链表 法一: 把A链表的节点都存HashSet里,遍历B链表找相同的节点 法二: 把A、B指针都移到末尾,再同时往回走,每次往回走都比较 当前节点的下一节点(a.next b.next ?)是否相同,当不相同…

antd pro常见代码示例-ProTable

1、protable使用 这是antd Pro 封装的一个table组件&#xff0c;提供了很多好用的方法&#xff0c; proTable地址&#xff1a; protable官网 代码示例&#xff1a; <ProTableactionRef{actionRef}pagination{{ //分页设置defaultPageSize: 10,showQuickJumper: true,sh…

【C++】异常

前言 本篇博客我们来看下C有关异常的处理&#xff0c;了解下异常有关的知识 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;C 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.异常的概念及使用 1.1异…

操作系统—进程与线程

补充知识 PSW程序状态字寄存器PC程序计数器&#xff1a;存放下一条指令的地址IR指令寄存器&#xff1a;存放当前正在执行的指令通用寄存器&#xff1a;存放其他一些必要信息 进程 进程&#xff1a;进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位…

NIO--ByteBuffer组件

文章目录 概述ByteBuffer 正确使用姿势ByteBuffer 结构ByteBuffer 常见方法分配空间向 buffer 写入数据从 buffer 读取数据mark 和 reset字符串与 ByteBuffer 互转Scattering ReadsGathering Writes ⚠️ Buffer 的线程安全 概述 ByteBuffer就是缓冲区&#xff0c;作为channel…

软件工程的熵减:AI如何降低系统复杂度

软件开发的世界&#xff0c;如同一个不断膨胀的宇宙。随着功能的增加和时间的推移&#xff0c;代码库越来越庞大&#xff0c;系统复杂度也随之水涨船高。代码膨胀、维护困难、开发效率低下等问题困扰着无数开发者。这不禁让人联想到物理学中的“熵增”原理——一个孤立系统的熵…

xss闯关

BUU上的[第二章 web进阶]XSS闯关 第一关 第一关很简单&#xff0c;没有任何过滤&#xff0c;直接输入&#xff1a;<script>alert()</script>即可。 第二关 第二关可以输入xss和<script>alert()</script>分别查看页面源代码&#xff0c;看看哪里变了…

Postman接口测试:postman设置接口关联,实现参数化

postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用postman获取上一个接口指定的返回值…

从算法到落地:DeepSeek如何突破AI工具的同质化竞争困局

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…

【通俗易懂说模型】反向传播(附多元回归与Softmax函数)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

电脑黑屏按什么键恢复?电脑黑屏的解决办法

电脑黑屏的原因有很多&#xff0c;可能是硬件、软件、系统或者病毒等方面造成的。那么&#xff0c;当我们遇到电脑黑屏时&#xff0c;应该怎么做呢&#xff1f;有没有什么快捷的方法可以恢复正常呢&#xff1f;本文将为您介绍一些常见的电脑黑屏情况及其解决办法。 一、电脑开机…

多智能体协作架构模式:驱动传统公司向AI智能公司转型

前言 在数字化浪潮的席卷下&#xff0c;传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈&#xff0c;客户需求的快速变化以及业务复杂度的不断攀升&#xff0c;传统公司在缺乏 AI 技术支撑的情况下&#xff0c;暴露出诸多痛点。在决策层面&#xff0c;由于…

CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战

前一篇文章&#xff0c;学习率调整策略 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started CNN 卷积神经网络 CNN什么是卷积工作原理深度学习的卷积运算提取特征不同特征核的效果比较卷积核感受野共享权重池化 示例源码 …

云上考场微信小程序的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Intellij IDEA如何查看当前文件的类

快捷键&#xff1a;CtrlF12&#xff0c;我个人感觉记快捷键很麻烦&#xff0c;知道具体的位置更简单&#xff0c;如果忘了快捷键&#xff08;KeyMap&#xff09;看一下就记起来了&#xff0c;不需要再Google or Baidu or GPT啥的&#xff0c;位置&#xff1a;Navigate > Fi…

支持多种网络数据库格式的自动化转换工具——VisualXML

一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作&#xff0c;WINDHILL风丘科技开发的总线设计工具——VisualXML&#xff0c;可轻松解决这一问题&#xff0c;提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…