分布式系统之基础抽象
Table of Contents
1. 分布式抽象的必要性
1.1 任何分布式系统的核心都是分布式算法
作为网络(系统)与应用的中间件实现。
系统的通道 | <——-> | 系统的通道 |
---|---|---|
中间件的算法 | 中间件的算法 | |
应用 | 应用 |
1.2 可靠的应用需要比网络协议(e.g. TCP,UDP)更强大的底层服务
1.2.1 通信
- 只能为一对一通信(客户端-服务端)提供可靠性保证(比如TCP)
- 如何做到组通信?
可靠广播 Reliable Broadcast
因果顺序广播 Causal order Broadcast
全序广播 Total order Broadcast
1.2.2 高层服务
- 有时,多对多通讯是不够的
- 需要可靠的高层服务
共享内存
共识(Consensus, 不是Consistency)
原子性提交
复制状态机
1.3 举例
①. 可靠广播
确保发送至组的信息要么被所有成员收到要么没有一个成员收到
②. 原子性提交
确保各进程就是否提交或终止事务(Transaction)达成一致决定。(既确保状态一致)
2. 基于事件的组件模型
2.1 分布式计算模型
- 一组进程与一个网络(通讯连接)
- 单一进程执行单一本地算法(程序)
- 每个进程都会进行计算步骤
- 网络进行计算步骤:
- 存储进程发送的消息
- 传递消息给某一进程
- 消息传递时会在接收过程中触发一个计算步骤
2.1.1 一个进程的计算步骤
- 接收一个消息(外部,输入)
- 执行本地计算
- 发送一个或多个消息给其他一些进程(外部,输出)
2.1.2 通信步骤
- 基于网络抽象
- 收到来自一个进程的消息,或者
- 发送一个消息给一个进程
2.2 进程内部
- 一个进程包括一组组件(自动机)
- 组件都是并行的
- 每个组件通过一个FIFO输入缓冲接收消息
- 发送消息给其他组件
- 事件是同一进程内不同组件间的消息
- 事件被称为事件处理者(Event Handler)的程序(行动)处理
2.3 基于事件编程
2.3.1 进程执行程序
- 每个程序包含了一组模块与组件规范
- 在运行时,这些被部署为组件
- 一般来说,这些组件组成了一个软件栈
- 组件通过事件进行交互(伴随属性):
- 被事件处理者处理
on event<COi Event1, attr1, attr2,...> do
// local computation
trigger<COj Event2, attr3, attr4,...>
2.3.2 几乎任何东西都可以是事件
- 消息(大多数时候)
- 计时器(内部事件)
- 条件(e.g. x==5 & y<9)
2.3.3 两种事件类型
- 请求(Requests)
(向下流动)输入
- 指示(Indications)
(如回复/确认 向上流动)输出
2.4 进程中的组件
单一过程中的组件堆栈
2.5 通道即是模块
通道也用模块来体现。
- 请求事件: 发送一些(带数据的)消息给目的地
trigger<send|dest,[data1,data2,...]>
- 指示事件:从源获取一些(带数据的)消息
upon event<deliver|src,[data1,data2,...]>
2.6 举例
使用一个广播组件的应用,使用通道组件进行广播