分布式系统之基础抽象

Tue, Mar 16, 2021

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 一个进程的计算步骤

  1. 接收一个消息(外部,输入)
  2. 执行本地计算
  3. 发送一个或多个消息给其他一些进程(外部,输出)

2.1.2 通信步骤

  1. 基于网络抽象
  2. 收到来自一个进程的消息,或者
  3. 发送一个消息给一个进程

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 举例

使用一个广播组件的应用,使用通道组件进行广播

举例

3. 规格