Lazy loaded image
📖Lecture 2 Overview of Typical RPC Mechanism
Words 1304Read Time 4 min
2025-7-16
2025-7-19
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
notion image
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)
  1. Network transport header
    1. invisible to RPC runtime and stubs
    2. Ethernet , Wi-Fi, etc.header
    3. IP header
    4. UDP OR TCP header
  1. RPC header
    1. only used by RPC runtime; opcode used by stub
    2. RPC Version ID
    3. Opcode
    4. Flags
    5. number of parameters , how long
  1. Body
    1. only used by stub;
      in-parameter values on client to server packets
      out-parameter values on server to client packets
    2. Serialized parameter 1
    3. Serialized parameter 2
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 模拟本地调用的这一方面是微不足道的
    💡
    分布式系统中的有不同的调用语义
    1. 至多一次 At-most-once 调用者发送请求后,如果未收到响应,不会重试。因此,被调用者可能执行 0 次或 1 次。
    1. 至少一次 At-least-once 调用者会重试请求直到收到响应,因此被调用者可能执行 1 次或多次
    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: 如果客户端在等待服务器响应时处于阻塞状态,消息可能会丢失,那么服务器会一直等待下去,还是在客户端设置超时
     
    上一篇
    Lecture 1 Introduction
    下一篇
    Lecture 3 Ideal vs Real Distributed Systems

    Comments
    Loading...