分布式系统定义的理解

148 阅读3分钟

1. 分布式系统的定义

分布式系统指的是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统。

2. "通过网络进行通信"的隐含语义

  1. 网络却是架构分布式系统的根基。网络的复杂性会给分布式系统带来非常大的复杂性。

  2. 服务调用方和服务被调用方不在一个进程,通过网络进行调用,即远程调用。在分布式系统的设计中,我们要充分考虑通过网络进行远程调用导致的不确定性。

  3. 服务调用方不知道服务被调用方的健康情况(服务是宕机,异常(过载),正常)

在远程调用过程中。从调用方发送数据到被调用方,不能保证在多少时间内到达,甚至不能保证一定能到达;这个时候需要采用超时机制,请求方在发起请求后,设置一个超时时间,这样能确保请求方在超时时间内,一定能得到一个响应。如果在超时时间内,请求方得到了明确的响应,不论这个响应是被调用服务回复的,还是网络地址不可达等网络错误,调用方都可以根据响应结果一一来处理。

相应结果可以分为以下几种:

  • 相应结果如果是被调用方返回过来的
    • 调用方可以根据情况进行处理
  • 相应结果如果不是被调用方返回过来的。
    • 网络不可达:可以采取重试等方法来处理
    • 没有相应:
      • 分为两种情况,被调用方处理了和被调用方没有处理,这个时候需要采用重试+幂等性保证请求只被处理一次。

      • 还需要考虑被调用方的健康程度,对重试机制增加退避策略,避免因为重试导致被调用方宕机和重试导致雪崩

3. "协调工作的计算机节点"的隐含语义

在分布式系统中提供冗余节点,来解决高可用的问题。“冗余”一词可能不太准确,可以使用“多节点”来替代,表达的意思都是在分布式系统内部,每个服务都提供多个节点进行工作。那么就存在多个服务之间的协同问题。

我们经常要面对这样的情况:

  • 同一时刻只允许一个线程操作某一个数据,
  • 同一时刻只允许一个线程执行某一个操作,

如果不遵守这个规则,就可能会导致数据错误等不可预料的后果,这就是线程之间的同步操作。

3.1 单体系统的解决方法

  • 加锁:需要协同的多个线程是属于同一个进程的,所以同步操作很简单,直接使用进程内的资源来做协同就可以了,比如锁、信号量等

3.2 分布式系统的解决方法

对于分布式系统来说,我们需要处理的是一个跨机器的多进程同步问题

  • 加锁:选择一个服务来做同步操作的管理者(同步服务)。在多个进程间需要同步时,就到同步服务来请求一个锁,获得锁的进程就可以操作,其他的进程就必须等待。
  • 为了保证同步服务的高可用需要部署多个实例。
    • 主节点如何被指定
    • 被指定的主节点宕机了。该如何处理。

分布式系统的多进程同步问题变成了同步服务的选主问题。其实,这是一个共识问题,需要分布式系统中参与同步的进程之间能达成共识,目前我们是通过 Paxos 或者 Raft 这样的共识算法来解决问题的