Distributed Systems and Cloud Computing: Review 1

This is the self-review pack of Distributed Systems and Cloud Computing. We have lesson 1-5.

Lesson 1

Presentation – Effective communication of information rather than of data
– Code and number conversion
– Transmission of sophisticated data structures
– Data compression
• Application
– Electronic mail
– File transfer protocols (ftp)
– virtual terminal protocols (telnet)
– Distributed system (distributed database)
– Client-server
image.png

image.png

Lesson 2

image.png

image.png

image.png

什么是中间件!
image.png

image.png

C/S
image.png

proxy server

“可移动代理(mobile proxy / downloadable proxy)”,本质是 RMI + mobile code

“我想调用这个远程对象,但我本地没有它的 proxy”

2️⃣ 系统从 另一个服务器(不是目标服务本身)
👉 把 proxy(stub)代码发给 client

  • proxy 是:
    • Java class / bytecode
    • 或其他可执行中间代码
  • 属于 mobile code

3️⃣ Client 本地 加载并执行 proxy

4️⃣ Client 调用 proxy 的方法
image.png

“Example mobile code: Applets” 指的就是运行在 client 端的代码,更准确地说,是从服务器下载到客户端、并在客户端 JVM 中执行的移动代码(mobile code)

image.png

image.png

  • Best-effort:大家一起抢资源,谁快谁用
  • QoS我保证你至少 / 至多 / 大概用到多少资源

image.png

指标 含义 例子
Latency(延迟) 多久能响应 RPC < 10ms
Throughput(吞吐) 单位时间处理多少 1000 req/s
Bandwidth(带宽) 传输速率 1 Gbps
Jitter(抖动) 延迟是否稳定 实时音视频

常见手段:

  • 流量分类(traffic classification)
  • 优先级队列(priority queue)
  • 带宽预留(bandwidth reservation)
  • Rate limiting / shaping

目标:多租户下的 SLA 保证

  • 一个用户卡了,不能拖垮其他人
  • 云厂商要“卖承诺”

常见说法:

  • SLA(Service Level Agreement)
  • QoS violation(服务质量违约)

典型 QoS 目标

  • Prefill latency < X ms
  • Decode TPS ≥ Y
  • P99 latency ≤ Z
  • 不因其他请求导致 OOM 或长尾爆炸
概念 区别
QoS 系统内部的资源/性能保证机制
SLA 对外承诺(合同级)
Performance 实际跑得快不快
Fairness 是否公平,不一定有保证
Best-effort 没有 QoS

image.png

System models

What are the main entities in the system?
👉 系统里“有什么东西”?

  • 进程 / 线程
  • 节点 / 机器
  • 用户 / 请求
  • 数据对象 / 状态

How do they interact?
👉 它们“怎么交流”?

  • 消息传递 or 共享内存
  • 同步 / 异步
  • RPC / 流 / 事件
  • 一对一 / 广播 / 组通信

What are the characteristics that affect their behaviour?
👉 哪些因素影响行为?

  • 时钟是否同步?
  • 网络是否可靠?
  • 是否会失败?
  • 是否存在恶意行为?

Interaction, Failure, Security 是“三大基础模型”

image.png

1️⃣ Interaction Model(交互模型)

回答问题:

系统组件如何通信?时间和顺序是否可预测?

典型分类:

  • 同步 / 异步
  • 有界延迟 / 无界延迟
  • 消息是否会丢 / 乱序

📌 影响:

  • 能否实现共识
  • 是否能设定超时
  • 是否能用锁 / barrier

2️⃣ Failure Model(失败模型)

回答问题:

系统中“坏事”会坏到什么程度?

常见失败模型:

  • Crash failure(宕机)
  • Omission(消息丢失)
  • Timing failure(超时)
  • Byzantine failure(恶意行为)

📌 不同失败模型 ⇒ 完全不同的算法复杂度
(比如 Paxos vs PBFT)


3️⃣ Security Model(安全模型)

回答问题:

系统是否面对攻击者?攻击能力有多强?

包括:

  • 是否有恶意节点
  • 是否能伪造消息
  • 是否窃听 / 篡改
  • 是否支持认证 / 加密

📌 决定:

  • 是否需要签名
  • 是否需要 PKI
  • 是否需要拜占庭容错

image.png

image.png

image.png

Lesson 3

image.png

The functionality encapsulated within each layer is called Protocol.

image.png

OSI
image.png

image.png

一种最基本、最通用的分布式交互协议模式(interaction pattern)
image.png

👉 Client(请求方) 和 Server(应答方)

哪些模型/协议?

实例 说明
RPC 远程过程调用,本质就是 request–reply
HTTP 请求–响应模型
gRPC 带强类型的 request–reply
数据库查询 Query → Result
LLM API Prompt → Response

image.png

image.png

image.png

image.png

IP multicast 是一种 网络层的一对多(one-to-many)通信机制

发送方只发送一份数据,网络负责把它复制并分发给所有加入该组的接收方。

image.png

  • Unicast:一对一(发 N 份给 N 个接收者)
  • Broadcast:一对所有(全网都收到)
  • Multicast一对一组(只给订阅者) ← IP multicast

IP multicast 在“哪一层”?

  • 网络层(IP 层)
  • 通过 多播地址 表示“接收者集合”
  • 网络设备(路由器)在必要的分叉点复制数据

Lesson 4

Distributed Objects and Remote Invocation

image.png
image.png

image.png

image.png

RMI(Remote Method Invocation,远程方法调用) 是一种分布式系统机制,它允许一个进程像调用本地对象的方法一样,调用运行在另一台机器上的对象方法。RMI 在底层通过 request–reply 的通信模式,将方法名和参数序列化后发送到远端,由远端对象执行并把返回结果或异常再传回调用方,从而对程序员隐藏网络通信、数据传输和位置差异等细节。

image.png

image.png

image.png

image.png

“调用语义(invocation semantics)”与“容错机制(fault tolerance)

在存在网络与节点故障的情况下,一个远程方法“到底被执行了几次”?

image.png

1️⃣ Maybe(可能执行,也可能没执行)

  • 不重传请求
  • 出错就直接失败
  • 调用方不知道远端是否真的执行过

📌 特点:

  • 最弱保证
  • 实现最简单
  • 语义最不安全

👉 本地 ≠ 远程 的根本原因就在这里

2️⃣ At-least-once(至少执行一次)

  • 请求丢了 → 重传
  • 可能 执行多次
  • 但调用方一定会收到:
    • 结果,或
    • 异常

📌 风险:

  • 副作用操作会出问题
    • 比如 withdraw(100) 可能扣两次钱

📌 PPT 中的例子:

  • Sun RPC

3️⃣ At-most-once(至多执行一次)

  • 请求可以重传
  • 服务器做重复检测
  • 已执行过的请求:
    • 不再重新执行
    • 直接重发上次的 reply

📌 这是最接近“本地调用”的语义
📌 PPT 中的例子:

  • Java RMI
  • CORBA
在问什么
Retransmit request message 请求丢了要不要重发?
Duplicate filtering 服务器要不要检测重复请求?
Re-execute / retransmit reply 重复请求怎么处理?
Invocation semantics 最终语义保证

how different fault-tolerance mechanisms in RMI (request retransmission, duplicate filtering, and reply retransmission) lead to different invocation semantics: maybe, at-least-once, and at-most-once.

image.png

Proxy

proxy 不是缓存(cache),而是“远程对象的本地代理(stub / proxy object)”。

result = remoteObj.foo(x);

实际发生的是:

  1. 调用的是 proxy 的 foo()
  2. proxy:
    • 序列化方法名 + 参数
    • 通过网络发送 request
  3. server 执行真正的 foo()
  4. 返回结果
  5. proxy 反序列化并返回

👉 这就是 “Instead of executing an invocation, it sends a message” 的含义

维度 Proxy (RMI) Cache
是否执行逻辑 ❌ 不执行 ❌/✅
是否存结果 ❌(默认)
是否减少网络通信
目的 透明性 性能
语义 远程调用 本地副本

一次“看起来像本地方法调用”的 RMI,在系统内部到底是怎么被拆解和执行的。
image.png

RMI 通过 proxy(stub)、remote reference module、communication module 和 server 端的 skeleton/servant,把本地方法调用转化为网络请求并在远端对象上执行。

它干三件事:

  1. 区分本地对象引用 vs 远程对象引用
  2. 生成 remote object reference
    • 包含:对象 ID、服务器地址、端口等
  3. 创建 proxy(stub)

📌 你可以把它理解为:

“RMI 的对象地址管理 + proxy 工厂”

Remote object table

  • 保存:
    • 本进程拥有的远程对象
    • 本地 proxy 对应的远程对象引用
  • 用来做:
    • 查找
    • 去重
    • 生命周期管理

1️⃣ RMI ≠ 魔法

  • 本地调用只是“表象
  • 实际是 消息传递 + 对象管理

2️⃣ 清晰的职责分离

  • proxy:接口透明
  • remote reference module:对象定位
  • communication module:网络
  • skeleton:方法分派
  • servant:业务逻辑

3️⃣ 为后续问题做铺垫

  • at-most-once 语义
  • failure handling
  • garbage collection(分布式)

image.png

RMI 是建立在 RPC 之上的、更高层的抽象;RPC 是机制,RMI 是面向对象语义的封装。
image.png

  • 没有对象、没有状态
  • 调用的是“某台机器上的某个过程”
  • 更贴近 C / 系统编程

📌 RPC:调用一次就完
📌 RMI:对象长期存在

RMI = RPC + 对象模型 + 远程引用管理

  • RPC:
    • 无状态(stateless)
  • RMI:
    • 对象有 identity
    • 多次调用作用在同一个远程对象
RPC RMI
实现复杂度
语义强度
分布式 GC
动态 proxy
现实系统 更像谁
gRPC RPC
Thrift RPC
Java RMI RMI
CORBA RMI
REST RPC(弱形式)
LLM API RPC

image.png

image.png

RMI code

image.png

image.png

Lesson 5

indirect communication

在讲 分布式系统中的“空间耦合(space coupling)”和“时间耦合(time coupling)”,用一个 2×2 的分类表 来系统地理解通信方式之间的本质差异

image.png

1️⃣ 空间耦合(Space coupling)

关注的是:

发送方是否需要“知道”接收方是谁/在哪里

  • 空间耦合(Space-coupled)
    • 发送方知道明确的接收者(地址、对象、进程)
  • 空间解耦(Space-uncoupled)
    • 发送方不知道具体接收者,只是“发出去”
    • 谁接收由系统/中介决定

2️⃣ 时间耦合(Time coupling)

关注的是:

发送方和接收方是否必须在同一时间存在

  • 时间耦合(Time-coupled)
    • 发送消息时,接收方必须“在线”
  • 时间解耦(Time-uncoupled)
    • 发送和接收可以发生在不同时间
    • 接收方可以晚点再出现

④ 空间解耦 + 时间解耦(右下)

最解耦、最灵活的通信方式

特性

  • 不知道接收者是谁

  • 不要求接收者立即存在

  • 双方生命周期完全独立

例子

  • Publish / Subscribe

  • Message Queue

  • Tuple Space(Linda)

  • 大多数间接通信模型

👉 本质:

“我只管发,谁来、什么时候收都无所谓”


image.png

image.png

JGroups 是一个 用于构建可靠组通信(group communication)的 Java 中间件库,常用于 集群、分布式系统的一致性与成员管理
一个让多台节点像“一个组”一样可靠通信的 Java 库,提供 成员发现、可靠消息广播、顺序保证、故障检测 等能力。

在分布式系统里,你经常需要:

  • 一组节点发送消息(不是点对点)
  • 知道谁在线、谁宕机
  • 保证消息 不丢、不乱序(可选)
  • 在节点 动态加入/离开 时系统还能正常工作

👉 JGroups 把这些通用而复杂的机制都封装好了。


image.png

实际中谁在用 jgroup?

  • JBoss / WildFly:集群通信

  • Infinispan:分布式缓存复制

  • Hazelcast(早期/类似思想)

  • IP Multicast:只负责“发”

  • JGroups:在 multicast 之上 补齐可靠性、顺序、成员管理

image.png

image.png

image.png

服务发现(Service Discovery) 是分布式系统中的一种基础机制,用来解决:

在一个节点数量、地址、状态都不断变化的系统里,客户端如何找到“当前可用”的服务实例?

服务发现 = 自动维护“服务名 → 可用实例地址”的映射机制
让调用方 不用关心 IP / 端口变化,只按服务名访问。

核心组成(3 个角色)

1️⃣ 服务注册(Service Registration)

服务启动时:

  • 向“注册中心”报告:

    我是谁 + 我在哪 + 我还活着

例如:

service = "user-service" address = 10.0.0.12:8080


2️⃣ 服务发现(Service Lookup)

客户端需要调用服务时:

  • 向注册中心查询:

    “user-service 现在有哪些可用实例?”


3️⃣ 健康检查(Health Check)

注册中心持续确认:

  • 服务是否存活
  • 宕机实例会被自动剔除

两种主流服务发现模式

🅐 客户端发现(Client-side Discovery)

客户端:

  1. 查询注册中心
  2. 自己做负载均衡
  3. 直接调用实例

📌 常见于微服务 / RPC 框架

优点

  • 灵活
  • 少一跳

缺点

  • 客户端逻辑复杂

🅑 服务端发现(Server-side Discovery)

客户端:

  1. 请求一个固定入口
  2. 由网关 / LB 转发到真实服务

📌 常见于云原生架构

优点

  • 客户端简单

缺点

  • 多一跳

下面这些都是分布式系统里非常经典的组件

  • ZooKeeper

  • etcd

  • Consul

  • Kubernetes(内置 Service / DNS)****

  • RPC / RMI
    👉 常常依赖服务发现来拿到目标地址

  • JGroups
    👉 偏向“组通信”,不是典型服务发现

  • 消息队列 / Pub-Sub
    👉 更进一步,连“找服务”都不需要

image.png