深入理解 RPC 交互流程

HDFS读写流程介绍,HDFS读数据和写数据的原理是什么? Client(客户端)对HDFS中的数据进行读写操作,分别是Client从HDFS中查找数据,即为Read(读)数据;Client从HDFS中存储数据,即为Write(写)数据。下面我们对HDFS的读写流程进行详细的介绍。假设有一个文件1.txt文件,大小为300M,这样就划分出3个数据块,如图1所示。   图1 文件划分情况   下面,我们借助图1所示的文件,分别讲解HDFS文件读数据和写数据的原理。   1.HDFS写数据原理   在我们把文件上传到HDFS系统中,HDFS究竟是如何存储.. 阅读详情

文节我们讲解 RPC 的消息交互流程,目的是搞清楚一个简单的 RPC 方法调用背后究竟发生了怎样复杂曲折的故事,以看透 RPC 的本质。

640?wx_fmt=png

上图是信息系统交互模型宏观示意图,RPC 的消息交互则会深入到底层。

RPC 是两个子系统之间进行的直接消息交互,它使用操作系统提供的套接字来作为消息的载体,以特定的消息格式来定义消息内容和边界。

RPC 的客户端通过文件描述符的读写 API (read & write) 来访问操作系统内核中的网络模块为当前套接字分配的发送 (send buffer) 和接收 (recv buffer) 缓存。

640?wx_fmt=png

如上图所示,左边的客户端进程写 RPC 指令消息到内核的发送缓存中,内核将发送缓存中的数据传送到物理硬件 NIC,也就是网络接口芯片 (Network Interface Circuit)。NIC 负责将翻译出来的模拟信号通过网络硬件传递到服务器硬件的 NIC。服务器的 NIC 再将模拟信号转成字节数据存放到内核为套接字分配的接收缓存中,最终服务器进程从接收缓存中读取数据即为源客户端进程传递过来的 RPC 指令消息。

消息从用户进程流向物理硬件,又从物理硬件流向用户进程,中间还经过了一系列的路由网关节点。

上图呈现的只是 RPC 一次消息交互的上半场,下半场是一个逆向的过程,从服务器进程向客户端进程返回响应数据。完整的一次 RPC 过程如下图所示:

640?wx_fmt=png

下面用 Python 代码来描述上述过程。

  • Server 端死循环监听本地 8080 端口,等待客户端的连接。

  • 客户端启动时连接本地 8080 端口,紧接着发送词一个字符串 hello,然后等待服务器响应。

  • 服务器接收到客户端连接后立即收取客户端发送过来的字符串,也就是 hello,打印出来。然后立即给对方回复一个字符串 world。

  • 客户端接收到服务器发送过来的 world,马上打印出来。

  • 关闭连接,结束。

# coding: utf-8
# server

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 8080))
sock.listen(1)  # 监听客户端连接
while True:
    conn, addr = sock.accept()  # 接收一个客户端连接
    print conn.recv(1024)  # 从接收缓冲读消息 recv buffer
    conn.sendall("world")  # 将响应发送到发送缓冲 send buffer
    conn.close() # 关闭连接

# coding: utf-8
# client

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 8080))  # 连接服务器
sock.sendall("hello")  # 将消息输出到发送缓冲 send buffer
print sock.recv(1024)  # 从接收缓冲 recv buffer 中读响应
sock.close() # 关闭套接字

如果从上面代码上观察,我们其实很难看出上图所示的复杂过程。浮现在多数人脑海中往往是下面的这幅简约模型图。相比之下它要简单很多,这也正是操作系统设计的魅力所在,让你时时刻刻都在使用它却感受不到它的存在。

640?wx_fmt=png

小结

通过本节内容,读者们对 RPC 的交互流程应该有了大致了解,但是还并不知道 RPC 之间到底交互了什么。就好比你能看到远方有几个人在说话,但是不知道他们在说啥。

640?wx_fmt=jpeg

下一节我们将放大细节,仔细观察 RPC 客户端服务器之间窃窃私语了什么,它们究竟是在用什么外星语言交流。

练习题

一个很有趣的小测试实验 , 请读者编写代码实现以下情景:

客户端疯狂发送请求,但是服务器不读不处理,会发生什么

640?wx_fmt=jpeg

扫一扫关注公众号「码洞」

想要更多精彩内容,请点击「阅读原文」

手写一个简化版的Dubbo框架 在学习了Dubbo之后, 我发现自己好像了解了Dubbo的实现原理, 又好像不是很了解, 毕竟我只是背诵了下概念, 没有深入的去看源码. 这里我就来手写一个简化版的Dubbo框架, 通过动手实践来深入理解Dubbo的实现原理. Dubbo的实现原理 RPC调用的过程 我们先来看下RPC调用的过程. 服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服... 阅读详情

相关推荐

深入理解RPC的设计与实现

RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服务的技术。RPC的提出是为了简化分布式系统之间的通信复杂性,让开发者在编写代码时能像调用本地方法一样调用远程方法。序列化是将对象状态转换为可存储或传输的格式的过程,在RPC中主要是将对象转换为字节流以便于通过网络传输。反序列化则是序列化的逆过程,将字节流转换回对象的过程。序列化对于RPC框架来说至关重要,因为它直接影响到远程调用的性能和安全性。

weixin_33239721的博客 1129

RPC协议交互流程

它允许一个计算机程序(通常是客户端)调用另一个计算机上的过程(通常是服务器端)并获取结果,就像调用本地过程一样,而无需了解底层网络通信的细节。通常涉及跨越网络传输数据,因此需要将数据序列化(将数据转换为字节流)以进行传输,并在接收端反序列化(将字节流还原为数据对象)在 RPC 中,参数和结果通常需要序列化(将数据转换为字节流)以进行传输,然后在接收端反序列化(将字节流还原为数据对象)客户端将序列化后的请求参数发送到远程服务器。服务端代理将数据进行反序列化,解析目标服务、目标方法及调用参数,调用相关请求。

Wanggj的博客 734

RealSense D455的标定并运行VINS-FUSION

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_40186909的博客 2万+

RPC:RPC的通信流程

为什么要学习RPC RPC 最大的特点就是可以让我们像调用本地一样发起远程调用。只要涉及到网络通信,我们就可能用到RPC,RPC是解决分布式系统通信的一大利器: 分布式系统中的网络通信一般都会采用四层的TCP协议或者七层的HTTP协议,前者占大多数,这主要得益于TCP协议的稳定性和高效性。 网络通信说起来简单,但是实际上是一个非常复杂的过程,这个过程包括:对端节点的查找、网络连接的建立、传输数据的编码解码以及网络连接的管理等,每一项都很复杂 你可以想象一下,在搭建一个复杂的分布式系统过程中,如果开发人员在

OceanStar的博客 2865

编译opencv4.2时出现undefined reference to `jpeg_default_qtables‘错误的解决方案

操作系统:kylinV10 opencv版本:4.2.0 在编译opencv4.2.0的版本时,出现undefined reference to `jpeg_default_qtables’的错误提示,导致openc编译中断,不能继续编译,所以这个错误必须解决。 解决方案 查看错误的名字,根据名字分析,很有可能是当前系统中没有安装jpeg第三方库,到 http://www.ijg.org/上下载最新的源码包 jpegsrc.v9e.tar.gz,按如下顺序开始编译安装: tar -xzvf jpegsr.

jndingxin的专栏 5108

快速上手:网页版EggNOG功能注释全流程解析

本文详细解析了网页版EggNOG在蛋白序列功能注释中的全流程操作,从初识工具到实战技巧,涵盖FASTA格式处理、参数设置、结果解读及常见问题解决方案。特别适合生物信息学初学者快速掌握这一高效注释工具,提升非模式生物基因组研究的注释效率。

weixin_29310631的博客 191

图解RPC【交互形式】【框架对比】

RESTful、 WebService、 HTTP、 基于DB做数据交换、基于MQ做数据交换,以及。: Remote Procedure Call ,即远程过程调用。对响应要求较高,客户端一直等待服务端返回。Server : Provider、服务提供者。Client : Consumer、服务消费者。可以像调用本地方法那样调用远程方法。系统A,B异步处理数据,数据允许积压。,从跨进程到跨物理机已经有几。Stub :存根、服务描述。

豆恭梓的博客 301

WSL2迁移后用户名不见了?一招教你快速恢复Ubuntu22.04默认用户

本文针对WSL2迁移后Ubuntu 22.04默认用户名丢失的常见问题,提供了详细的诊断与修复方案。通过分析迁移底层逻辑,指导用户使用`ubuntu2204.exe config --default-user`命令或配置`/etc/wsl.conf`文件快速恢复用户身份,并涵盖权限修复、冲突解决及自动化迁移脚本等进阶内容,确保子系统迁移后环境完整可用。

web39explorer的博客 558

RPC 原理与实现

文章目录1. RPC 简介1.1 什么是RPCReference: LPC & IPC (本地过程调用)1.2 为什么要用RPC1.2.1 系统架构的演进1.2.2 Web 服务的技术结构1.2.2 SOAP ( Simple Object Access Protocol)1.2.2 REST(REpresentational State Transfort)SOAP & REST......

谈谈1974 5418

目标检测: yolo26在RK3588上部署

YOLO26发布:端到端目标检测新突破 摘要:Ultralytics最新发布的YOLO26算法采用原生端到端设计,无需NMS后处理,显著提升推理效率。该模型基于三大核心原则: 简洁性:消除NMS步骤,实现直接预测 部署效率:简化集成流程,降低延迟 训练创新:引入MuSGD混合优化器,加速收敛 部署教程显示,YOLO26可适配RK3588等边缘设备,通过ONNX转换和RKNN工具链实现高效部署。其创新架构特别优化了分割、姿态估计等专业任务,标志着目标检测技术的重要革新。 (字数:149)

qianxun 1454

ardupilot SBUS输入捕获

本节主要记录ardupilot 的sbus 输入捕获功能。ardupilot 默认支持多种无线协议控制输入设备,比如常用的PPM,SBUS,IBUS,DSM,SUMD,SRXL等协议,本节主要讲解ardupilot 如何通过定时器的pwm输入捕获来获取sbus数据。

陌城烟雨 271

rpc系列-简介2

承接rpc系列-rpc01:https://blog.youkuaiyun.com/qq_19968255/article/details/82894381 示例 1.结构 2.代码 客户端: rpc-client /** * 框架的RPC 客户端(用于发送 RPC 请求) */ public class RpcClient extends SimpleChannelInboundH...

独立开发,substack顶级编辑 1608

【Simulink教程案例19】基于simulink的扩频通信系统建模与仿真

扩频是一种应用于数字调制信号的调制技术,可以提高传输信号的带宽。扩频通信具有抗干扰能力强,扩频增益越大,抗干扰能力越强。而且扩频通信具有很强的保密性,扩频后信号近似白噪声,功率谱密度也很低。扩频通信可用于多址通信。扩频调制有如下三个特点:① 扩频后信号的带宽远大于信号所需的带宽② 使用扩频码进行扩频调制,扩频码与信号中的数据相互独立③ 在接收端,通过将接收信号与扩频码的同步副本进行相关,实现解扩。

FPGA/MATLAB学习教程/源码/项目合作开发 2197

Netty学习(八)----实现RPC-demo (能通就行版)

一: 交互流程 说明: client stub 接收到方法调用后 对参数、方法签名封装成易网络传输的消息体 client stub 将消息进行编码,并发送至服务端 server stub 接收消息并进行解码 server stub 根据解码结果调用本地的服务 server本地服务应答server stub servier stub 将执行结果进行封装编码至消费方 消费方进行解码,告知clie...

Lcy 282

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

回顾从hdfs数据读过程看RPC

Client端 org.apache.hadoop.hdfs; DistributedFileSystem 客户端与namenode端协议使用ClientProtocol public FSDataInputStream open(Path f, final int bufferSize) throws IOException { statistics.inc

数据技术控 2359

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

hadoop大数据--深入讲解hdfs源码

hdfs 读数据的流程 1、跟namenode通信查询元数据,找到文件块所在的datanode服务器。 2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流。 3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)。 4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件。 hdfs 写数据的流程 1、根nameno...

学亮编程手记 562

《面试八股文》之Dubbo17卷

虽然金三银四过了,但是金九银十马上就要到了,还不快快准备起来?今天就开启《》系列的第一版-1.Dubbo是什么?RPC又是什么?2. Dubbo能做什么?3.能说下Dubbo的总体的调用过程吗?4.说说Dubbo 支持哪些协议,每种协议的应用场景和优缺点5.Dubbo中都用到哪些设计模式?6.如果Dubbo中provider提供的服务由多个版本怎么办?7.服务暴露的流程是怎么样的?8.服务引用的流程是怎么样的?9.Dubbo的注册中心有哪些?10.聊聊Dubbo SPI机制?......

weixin_70730532的博客 159

GRPC 自学 之路

GRPC 远程调用学习,自己实验运行grpc +python 实例。grpc 函数理解使用,拦截器学习等;

weixin_43159653的博客 1025

5个Dubbo面试题,含金量超高

我们根据两个数据包的自述,来总结一下netty3和netty4的线程模型。1、netty3写过程2、Netty4的读写过程说明:这里没有netty3的读过程,netty3读过程和netty4相同,pipeline是由IO线程执行。总结:netty3与netty4线程模型的区别在于写过程,netty3中pipeline由业务线程执行,而netty4无论读写,pipeline统一由IO线程执行。...

m0_67322837的博客 156

深入理解RPC之手写RPC框架

目录一. RPC是什么二.RPC流程三. RPC协议四. 手写RPC框架功能快捷键 一. RPC是什么 RPC全称remote procedure call,翻译过来就是远程过程调用。在分布式系统中,一个模块像调用本地方法一样调用远程方法的过程,就叫RPC。 我们耳熟能详的webservice、restful接口调用都是RPC,只是消息的组织方式和消息协议不同。 二.RPC流程 RPC的流程大致如上图所示: 客户端调用client stub(client stub位于本地,就和调用本地方法一样),传递参

g2591324079的博客 2914

33.服务之间的调用之RPC、Restful深入理解

RPC、REST API深入理解一:RPCRPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实现有 XML-RPC , JSON-RPC , 通信方式基本相同, 所不同的只是传输数据的格式.RPC是分布式架构的核心,按响应方式分如下两种:同步调用:客户端调用服务方方法,等待直到服务方返回结果...

郑学炜的技术博客 5万+

深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务

RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要角色。Google 开源了 gRPC,Facebook 开源了 Thrift,Twitter 开源了 Finagle,百度开源了 bRPC,腾讯开源了 Tar...

LouisLee 的博客 1644
上一篇: 深入理解RPC——RPC在企业服务中的核心价值
下一篇: 我为Redis找到了一个新家——VMWare
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值