type
status
date
slug
summary
tags
category
icon
password
原文
典型的 RPC 机制概述
Two aspects: control and syntax
Control abstraction supported by a runtime system
- RPC transport mechanism RPC传输机制
- details depend on specific RPC package 具体细取决于你所使用的 RPC 包
Typical client side transport routines
- makerpc (request-pkt,&reply-pkt)
- blocks until reply or failure detected 阻塞直到检测到回复或失败
Typical server side transport routines
- getrequest(&requst-pkt) blocks until request arrives
- sendresponse(reply-pkt) sends reply
Actual RPC packages
- more parameters , such as timeouts
- more runtime routines
Syntax abstraction supported by stub routines
- code generated by stub generator
- input is interface description
底层的传输机制需要一个请求数据包,因此需要将这些编程语言层面的参数转换为请求数据包,这个转换者被称为 stub 生成器,简称 stub。
stub 的主要功能是将实际传递的参数或调用返回的结果,正确地地组织到请求数据包或回复数据包中。
Client Stub
- invoked by user code as a local procedure
- packs into parameters into request-pkt (aka “marshall”)
- invokes makerpc()
- unpacks reply-pkt into output parameters(aka “marshall”)
- returns to user code

The packed format of an RPC parameter is called its serialized format
Converting to/from serialized format is serialization / de-serialization
These All Mean the same Thing
- Packing / Unpacking
- Marshalling / UnMarshalling
- Serialization / De-Serialization
We will use these terms interchangeably in class , They all refer to the work done by the client sub and server stub。
这些术语都是描述的同一件事情,都是 client sub、 server sub 完成的工作。
Q: RPC 可以是异步的吗
A: 根据RPC的标准定义是同步的,如果是异步的,那就不是远程过程调用了。
Q: 填充数据过程中是否能使用压缩(指的 stub 这部分工作)
A:关于是否能够压缩没有给出明确的定义,远程过程调用的严格定义要求系统中不能有任何比特的丢失,但是任何无损的优化是允许的。
RPC Packet Format
Detail depend on specific RPC package
详细的信息取决于特定的 RPC 包。
General format as follows 一般格式如下(request、response)
- Network transport header
- Ethernet , Wi-Fi, etc.header
- IP header
- UDP OR TCP header
invisible to RPC runtime and stubs
- RPC header
- RPC Version ID
- Opcode
- Flags
- number of parameters , how long
- …
only used by RPC runtime; opcode used by stub
- Body
- Serialized parameter 1
- Serialized parameter 2
- …
only used by stub;
in-parameter values on client to server packets
out-parameter values on server to client packets
Opcode 操作方式(预先定义好的),可以理解为函数,这里指调用的服务端函数,例如 Opcode 为 0,可能对应的是一个购买车票的方法。
其中每个部分的字节大小,由客户端和服务端协商决定。
网络传输存在固定成本,与数据包大小无关。
Stub Generation
存根生成
Two problems
- interface description
- code generation
Project 1 makes you write this code by hand (painful!)
To avoid this pain rely on simple compiler technology
- stub generator is like a preprocessor
- outputs source code(e.g.in C) , compiled by usual compiler
Describing an interface
- like specifying an abstract data type 就像指定抽象数据类型一样
- customized interface definition language(IDL) 自定义接口语言
- interface description provides
- name and parameters of each procedure
- parameter usage:in , out , inout
- out params not included in request
- in params not included in reply
in 意味着该参数用于将指从客户端传递到服务器,而无需返回。
out 该参数指从服务端传递到客户端。
inout 参数从客户端传送到服务端并返回。
Stub(存根),是 RPC 的一个核心组件,它充当的客户端调用远程服务的本地代理,隐藏了底层网络通信的复杂性。它分离了业务逻辑和网络通信的代码。
Client 、 Server 都存在 Stub,参考 Java RMI or gRPC。
- 封装网络通信的细节
- 客户端调用 Stub 时,Stub 负责将调用信息(方法名、参数等)序列化成网络传输格式(如 Protobuf、JSON)。
- 通过底层网络协议(如 TCP/HTTP)将请求发送到远程服务器。
- 接收服务器的响应结果后,反序列化为本地对象并返回给客户端。
- 定义请求/响应的数据格式(如 gRPC 使用 Protobuf)。
- 管理连接池、超时、重试等网络策略。
- 模拟本地调用体验
Client Stub
Client stub code structure
- pack parameters
- invoke RPC transport , block ,check for runtime errors.
- unpack reply
Example:
Server Stub
Typical server main loop
Server stub code structure
- unpack parameters
- examine opcode and demultiplex
- invoke server procedure locally (this is where real work gets done)
- pack reply packet
- invoke RPC transport to send reply 调用 RPC 传输以发送回复
Server Stub:Example
TCP 存在粘包问题,所以需要在 RPC 格式中加入数据包长度。
RPC Transport
Local procedure semantics 本地过程语义
- 1 invocation by caller → 1 execution of callee 调用方 1 次调用 → 被调用方执行 1 次(Exactly-once)
- ideal distributed environment: no failures 理想的分布式环境:无故障
- trivial to emulate this aspect of local calls 模拟本地调用的这一方面是微不足道的
分布式系统中的有不同的调用语义
- 至多一次 At-most-once 调用者发送请求后,如果未收到响应,不会重试。因此,被调用者可能执行 0 次或 1 次。
- 至少一次 At-least-once 调用者会重试请求直到收到响应,因此被调用者可能执行 1 次或多次
- 恰好一次 Exactly-once 保证被调用者精确执行一次,即使调用者重试请求
Exactly-once实现非常之所以困难,是因为互联网本身就是一个不稳定的系统。互利网最大的特性是数据传输仅以最大努力为基础。
But real distributed systems are flaky 但真正的分布式系统是不稳定的
- server hardware failures, server software failures,… 服务器硬件故障,服务器软件故障
- lost packets , mutilated packets ,hard network failures,… 数据包丢失、数据包损坏、网络严重故障
- even more complexity in store , as discussed below
传输的成功并不保证信息被成功接收,但是成功收到回复则确保你的请求已成功送达。分布式系统中的不对称性是众多问题的来源之一。
Timeouts in Distributed Systems
One approach
- send request packet
- start timer
- if reply not in when timer goes off , declare failure 如果计时器关闭时没有回复,请声明失败
Q: 如果客户端在等待服务器响应时处于阻塞状态,消息可能会丢失,那么服务器会一直等待下去,还是在客户端设置超时
- Author:newrain-zh
- URL:https://alex.sh.cn/article/cmu-15-440/rpc-2
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!