分布式系统:1.introduction to Distributed Systems

本文最后更新于:2022年3月15日 中午

1. introduction to Distributed Systems

1.1 About Distributed Systems

单机的并发(concurrency)又称为是共享内存(shared-memory)的并发,通过指针或变量可以很方便的进行

而非单机场景下,不同的电脑可以并行执行程序,他们只能通过网络通信,构成分布式系统

分布式系统中每一个电脑被称为结点(node),结点可以是任何互相连接的计算设备

为何构建分布式系统?(优点)

  1. 一些应用是天然(intrinsically)的分布式系统,例如接打电话
  2. 分布式系统比单机更加可靠
  3. 分布式系统有更好的性能,更快的响应速度(地理相邻)
  4. 一些数据太大而不能放在一个机器上

缺点

  1. 网络错误导致结点无法相互通信
  2. 结点可能会崩溃(crash)、运行缓慢

因此:

  • 我们需要有方法检测crash
  • 分布式系统需要有容错处理

1.2 RPC(远程过程调用)

分布式系统不关心网络如何传输,只关心网络的两个指标:时延(latency)、吞吐量(bandwidth)

RPC的调用其他本地的函数一样,只是在本地的代码中,一部分的执行需要等待别的结点上的程序的执行结果返回。

RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯),在调用时会留下一个stub,就像其他本地的代码一样。

  • 通信流程
    • 首先寻址通讯,建立TCP连接
    • 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
    • B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。
    • 返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式,交给A服务器上的应用
    rpc rpc

rpc2

rpc2

如果RPC调用失败,则会重试不止一次。但如果一直错误,不能无限的重试,因此需要设置超时(timeout)

RPC框架要做到最基本的3件事情:

  • 服务端如何确定客户端要调用的函数
    在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
  • 如何进行序列化和反序列化
    客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取的固定格式时就需要进行序列化和反序列化,序列化和反序列化的速度也会影响远程调用的效率。
  • 如何进行网络传输
    多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。如gRPC使用HTTP2。不同的协议各有利弊。TCP更加高效,而HTTP在实际应用中更加的灵活

REST

representational state transfer 表征状态转移(REST)

REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。REST规范把所有内容都视为资源,网络上一切皆资源。

  • 6个约束
    1. 客户端—服务器
      服务端与客户端独立实现并独立开发,只要接口不改变即可。提高跨多个平台的用户接口的可移植性并提高可伸缩性。
    2. 统一接口
      系统中的多个组件都依赖于统一接口,包含4个子约束:
      1. 资源的标识
        资源通过URL区分,当访问一个URL时,能够获取该资源或对它执行相应的操作。
      2. 通过表述操作资源
        客户端请求资源时,可以指定期望的格式,服务器返回响应时,响应包含了指定格式的资源。访问同一个资源的不同格式无须修改资源的标识符,客户端也可以通过资源的表述对资源进行操作。
      3. 自描述消息
        客户端和服务器之间传递的消息都应包含足够的信息(如资源表述的格式和内容长度,甚至相关的其他操作信息)。
      4. 超媒体作为应用程序状态的引擎(HATEOAS)
        服务器返回的资源表述中包含与之相关的链接,这些链接能够对资源执行其他操作。
    3. 分层系统
      服务端和客户端不知道网络中介(代理或网关等)的存在,增强安全、负载均衡和响应缓存等。
    4. 缓存
      客户端和网络中介都可以缓存服务器返回的响应,以便于减少数据获取延迟和服务器的请求次数,提高系统性能。
    5. 无状态
      服务器不会记录或存储客户端的状态信息。从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。
    6. 按需编码(可选)
      允许服务器临时向客户端返回可执行的程序代码用于客户端拓展和自定义功能,简化客户端。

Untitled

SOA(Service-Oriented Architecture)

将一个大型软件分成多个服务(或多个结点),其间通过RPC来通信

微服务是SOA架构的一种变体