每次 Google 搜索、Netflix 流媒体和银行转账都依赖分布式系统,其中多台计算机一起工作来完成单台机器不可能的任务。理解这些系统如何处理通信、故障和协调正变得对现代软件开发人员至关重要。
使分布式系统不同的根本挑战是部分故障。在单计算机程序中,所有东西通常一起崩溃。在分布式系统中,一些组件可以失败而其他继续运行。例如,数据库可能崩溃而 Web 服务器继续运行,或网络连接可能失败而两个服务都保持健康。
这造成歧义。当我们发送请求并接收无响应时,我们无法确定发生了什么。
- 请求是否从未到达?
- 服务器是否处理了它,但在响应前崩溃?
- 响应是否丢失?
分布式系统中的每个概念都解决这个挑战的某些方面。
在本文中,我们将看看分布式系统周围的五个基础主题:计算机如何跨网络通信、实现可靠通信的协议、远程过程调用如何抽象复杂性、处理故障的策略,以及为什么时间同步提出独特挑战。
五个基础主题
1. 网络通信
计算机如何通过网络发送和接收数据。
2. 可靠通信协议
确保数据可靠传输的协议。
3. 远程过程调用(RPC)
抽象网络通信复杂性的机制。
4. 故障处理策略
处理部分故障的方法和技术。
5. 时间同步
在分布式系统中协调时间的挑战。
部分故障的挑战
部分故障是分布式系统的定义特征。它意味着系统的某些部分可以失败而其他部分继续运行。这创建了不确定性:
当客户端发送请求并接收无响应时,可能的情况:
请求从未到达服务器
- 网络问题
- 服务器宕机
服务器处理了请求但在响应前崩溃
- 服务器故障
- 处理时间过长
响应丢失
- 网络问题
- 客户端问题
这种不确定性使得分布式系统设计复杂。每个概念和模式都试图解决这个问题的某些方面。
应对策略
重试机制
当请求失败时自动重试。
超时
设置请求超时时间,防止无限等待。
幂等性
确保重复请求产生相同结果。
确认机制
确认消息已接收和处理。
超时和重试组合
结合使用超时和重试处理临时故障。
本文为学习目的的个人翻译,译文仅供参考。
原文链接:The Must-Know Fundamentals of Distributed Systems。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。