每次 Google 搜索、Netflix 流媒体和银行转账都依赖分布式系统,其中多台计算机一起工作来完成单台机器不可能的任务。理解这些系统如何处理通信、故障和协调正变得对现代软件开发人员至关重要。

使分布式系统不同的根本挑战是部分故障。在单计算机程序中,所有东西通常一起崩溃。在分布式系统中,一些组件可以失败而其他继续运行。例如,数据库可能崩溃而 Web 服务器继续运行,或网络连接可能失败而两个服务都保持健康。

这造成歧义。当我们发送请求并接收无响应时,我们无法确定发生了什么。

  • 请求是否从未到达?
  • 服务器是否处理了它,但在响应前崩溃?
  • 响应是否丢失?

分布式系统中的每个概念都解决这个挑战的某些方面。

在本文中,我们将看看分布式系统周围的五个基础主题:计算机如何跨网络通信、实现可靠通信的协议、远程过程调用如何抽象复杂性、处理故障的策略,以及为什么时间同步提出独特挑战。

五个基础主题

1. 网络通信

计算机如何通过网络发送和接收数据。

2. 可靠通信协议

确保数据可靠传输的协议。

3. 远程过程调用(RPC)

抽象网络通信复杂性的机制。

4. 故障处理策略

处理部分故障的方法和技术。

5. 时间同步

在分布式系统中协调时间的挑战。

部分故障的挑战

部分故障是分布式系统的定义特征。它意味着系统的某些部分可以失败而其他部分继续运行。这创建了不确定性:

当客户端发送请求并接收无响应时,可能的情况:

  1. 请求从未到达服务器

    • 网络问题
    • 服务器宕机
  2. 服务器处理了请求但在响应前崩溃

    • 服务器故障
    • 处理时间过长
  3. 响应丢失

    • 网络问题
    • 客户端问题

这种不确定性使得分布式系统设计复杂。每个概念和模式都试图解决这个问题的某些方面。

应对策略

重试机制

当请求失败时自动重试。

超时

设置请求超时时间,防止无限等待。

幂等性

确保重复请求产生相同结果。

确认机制

确认消息已接收和处理。

超时和重试组合

结合使用超时和重试处理临时故障。

本文为学习目的的个人翻译,译文仅供参考。

原文链接:The Must-Know Fundamentals of Distributed Systems

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。