分布式计算的谬误是一个由8个陈述组成的列表,描述了参与分布式系统的架构师和开发人员可能会做出的错误假设(但无疑应该避免)。在这篇博文中,我们将看看这些谬论是什么,它们是如何产生的,以及如何驾驭它们以设计可靠的分布式系统。
什么是分布式计算的谬误?
构建你知道你可以依赖的分布式系统不是一件容易的事。即使是一个只由几个节点组成的 "简单 "系统,也有其复杂性。这些节点必须通过网络进行通信。然而,他们中的一个可能会失败,或者网络本身可能变得不可用,或者经历高延迟。
在设计我们的分布式系统时,必须牢记我们不能假设一切都会按计划进行。我们必须意识到有一些限制和障碍是我们需要克服的。
为了更好地理解可靠的分布式系统工程所带来的挑战,我们必须参考分布式计算的谬误--建筑师和开发人员可能做出的错误假设清单。它们是这样的。
- 网络是可靠的。
- 延迟是零。
- 带宽是无限的。
- 网络是安全的。
- 拓扑结构不会改变。
- 有一个管理员。
- 运输成本为零。
- 网络是同质的。
这些谬论的确切来源有点令人困惑。L. Peter Deutsch,当时是Sun Microsystems的雇员,通常被认为是在1994年起草了这7个谬论。然而,一些声音却不这么认为。
*"我们今天所知道的八大谬误实际上一开始只是四个谬误。前四个谬论是在90年代初(1991年后的某个时间)由两位Sun Microsystems的工程师Bill Joy和Dave Lyon创造的。
詹姆斯-高斯林(James Gosling)当时是太阳微系统公司的研究员--他后来创造了Java编程语言--将这前四个谬误归类为 "网络化计算的谬误"。十年后,太阳公司的另一位研究员彼得-多伊奇(Peter Deutsch)增加了第五、第六和第七个谬误"。*
说到最后一个谬论,事情似乎更清楚了*--*它是由另一位 "Sun研究员 "James "Dr. Java" Gosling在1997年左右添加的。
这8个谬误应该作为分布式系统的架构师和设计师的警告。相信这些说法是真的,会给系统和它的创造者带来更多的麻烦和痛苦。如果我们想拥有一个可靠的分布式系统,我们应该期待并准备好与这些说法完全相反的情况。
hbspt.cta.load(6939709, 'e3ba758f-66f2-4e49-baa9-a4c89803cb99', {"useNewLoader":"true","region":"na1"});
潜心研究分布式计算的谬误
我们现在将仔细看看这些谬论中的每一个,包括它们可能导致的问题,以及你可以采取哪些措施来减轻它们。
1.网络是可靠的
在我们谈论第一个谬论之前,让我们快速地看看可靠性是什么意思。在Ably,我们把可靠性定义为产品或服务在使用时符合其规格的程度,即使是在发生故障的情况下。因此,你可以把可靠性看作是正常运行时间的质量--也就是说,保证功能和最终用户的用户体验尽可能有效地保存下来。
现在,回到我们的谬论。网络是复杂的,动态的,而且往往是不可预测的。许多原因可能导致网络故障或与网络有关的问题:交换机或电源故障、错误配置、整个数据中心变得不可用、DDoS攻击等等。由于这种复杂性和普遍的不可预测性,网络是不可靠的。
那么,你如何使你的分布式系统可靠,确保它继续按预期工作,即使在不可靠的网络背景下?
接受失败并将其视为理所当然的事是至关重要的。你应该设计你的系统,使其能够减轻不可避免地发生的故障,并在逆境中继续按预期运行。
具体来说,从基础设施的角度来看,你需要将你的系统设计成具有容错性和高度冗余性。关于这一点的更多细节以及你需要考虑的问题,请阅读我们关于分布式系统中工程可靠性和容错性的博文。
容错设计的一个例子
除了基础设施方面的问题,你还需要考虑到由于网络故障而导致的连接中断、消息和API调用的丢失。对于某些用例(如实时聊天应用程序),数据的完整性是至关重要的,所有的消息都必须准确无误地按顺序传递给终端用户--在任何时候都是如此(即使涉及到故障)。为了确保数据的完整性,你的系统必须表现出有状态的特点。此外,你需要一些机制,如自动重新连接和重试、重复数据删除(或空闲),以及强制执行消息排序和保证交付的方法。
2.延迟为零
当你在本地环境中运行应用程序时,延迟可能接近零,而且在局域网上通常可以忽略不计。然而,在广域网中,延时很快就会恶化。这是因为在广域网中,数据往往需要从一个节点到另一个节点进行更远的传输,因为网络可能跨越很大的地理区域(这通常是大规模分布式系统的情况)。
当你设计你的系统时,你应该记住,延迟是网络的一个固有的限制。我们永远不应该假设在发送的数据和接收的数据之间没有延迟或零延迟。
延迟主要受距离和光速的制约。当然,对于后者我们也无能为力。即使在理论上完美的网络条件下,数据包也不能超过光速。然而,当涉及到距离时,我们可以做一些事情:通过边缘计算使数据更接近客户。如果你正在建立一个基于云的系统,你应该仔细选择你的可用区,确保它们靠近你的客户,并相应地路由流量。
考虑到延迟问题,这里还有几件事需要思考。
- 缓存*。 浏览器*缓存可以帮助改善延迟,减少发送到服务器的请求数量。你也可以使用CDN来缓存世界上多个地点的资源。一旦缓存,就可以通过离客户端最近的数据中心或存在点进行检索(而不是由原点服务器提供)。
- 使用一个事件驱动的协议。根据你的用例的性质,你可以考虑使用WebSockets这样的通信协议。与HTTP相比,WebSockets的往返时间要短得多(一旦建立了连接)。此外,WebSocket连接保持开放,一旦数据可用,就可以在服务器和客户端之间实时地来回传递--这比HTTP请求-响应模式有很大的改进。
- 服务器性能。服务器性能(处理速度、使用的硬件、可用的内存)和延迟之间有很强的相关性。为了防止网络拥挤和你的服务器超载,你需要有能力(动态地)增加服务器层的容量并重新分配负载。
3.带宽是无限的
延迟是指数据从A点到B点的速度,而带宽是指在一定的时间范围内,有多少数据可以从一个地方传输到另一个地方。
带宽与延时
毫无疑问,自90年代提出这8个谬论以来,计算技术已经取得了重大进展。网络带宽也得到了改善,我们现在能够在网络上发送更多的数据。
然而,即使有了这些改进,网络的容量也不是无限的(部分原因是我们产生和消费数据的欲望也在增加)。当大量的数据试图通过网络流动,而没有足够的带宽支持时,就会出现各种问题。
- 排队延迟、瓶颈和网络拥堵。
- 数据包丢失导致服务质量低下的保证,即信息丢失或不按顺序传递。
- 糟糕的网络性能,甚至整体系统不稳定。
有多种方法可以提高你的网络带宽能力。其中。
- 全面监控*。* 跟踪和检查网络中的使用情况是非常重要的,这样你就能迅速发现问题(例如,谁或什么占用了你的带宽)并采取适当的补救措施。
- 多重化。像HTTP/2、HTTP/3和WebSockets这样的协议都支持多路复用,这是一种提高带宽利用率的技术,它允许你把来自几个来源的数据结合起来,通过同一通信渠道/媒介发送。
- 轻量级数据格式。你可以通过使用为速度和效率而建立的数据交换格式,如JSON,来保护你的网络带宽。另一个选择是MessagePack,这是一种紧凑的二进制序列化格式,可以创建比JSON更小的消息。
- 网络流量控制。你需要考虑使用诸如节流/速率限制、拥堵控制、指数退避等机制。
4.网络是安全的
Gene Spafford("Spaf"),世界领先的安全专家之一,曾经说过。
"唯一真正安全的系统是一个断电的系统,它被铸在一块混凝土里,并被封在一个有武装警卫的铅制房间里--即使这样我也有疑问。
网络被攻击或破坏的方式有很多:错误、操作系统和库的漏洞、未加密的通信、导致数据被未授权方访问的疏忽、病毒和恶意软件、跨站脚本(XSS)和DDoS攻击,这只是其中的几个例子(但这个名单是无穷无尽的)。
尽管在分布式计算的世界里,真正的(绝对的)安全是一种谬论,但当你设计、构建和测试你的系统时,你还是应该尽你所能地去防止漏洞和攻击。目的是让安全事件尽可能少地发生,并且影响和后果有限。
这里有几件事需要考虑。
- 威胁建模。建议使用一个结构化的过程来识别潜在的安全威胁和漏洞,量化每个威胁的严重性,并优先考虑缓解攻击的技术。
- 深度防御。你应该使用分层的方法,在网络、基础设施和应用层面进行不同的安全检查。
- 安全心态。在设计你的系统时,你应该牢记安全,并遵循最佳实践和行业建议和意见,如OWASP的十大列表,其中涵盖了你的系统应该具备的最常见的Web应用安全风险。
5.拓扑结构不会改变
简而言之,网络拓扑结构指的是网络中的链接和节点的排列方式以及彼此之间的关系。在一个分布式系统中,网络拓扑结构一直在变化。有时,它是由于意外的原因或由于问题,如服务器崩溃。其他时候,它是故意的--我们增加、升级或删除服务器。
当你设计你的分布式系统时,重要的是不要依赖网络拓扑结构的一致性,不要期望它在任何时候都能以某种方式行事。你可以选择使用众多类型的网络拓扑结构,每一种都有自己的优点和缺点。
网络拓扑结构的类型
例如,在环形拓扑结构中,每个节点正好连接到另外两个节点。数据从一个节点到另一个节点,每个节点都处理每一个数据包。使用环形拓扑结构的一些优点。
- 你不需要一个中央节点来管理连接。
- 它相对容易重新配置。
- 它可以做成全双工(双环拓扑结构),允许数据在顺时针和逆时针两个方向流动。
缺点是,单环拓扑结构很容易发生故障。如果一个节点发生故障,就会导致整个网络瘫痪。
现在让我们来看看另一种类型的拓扑结构。在网状拓扑结构中,没有中央连接点,因为各节点是相互连接的。网状拓扑结构使用两种不同的方法进行数据传输:路由(节点确定从源头到目的地的最短距离),和泛洪(信息被发送到网络内的所有节点)。网状拓扑结构的优点。
- 节点的互连性使网络具有持久性和容错性,没有单点故障。没有一个设备可以使网络脱机。
- 可以不间断地增加新的节点。
- 适用于高速数据传输(当使用路由时)。
至于缺点,这是一个复杂的拓扑结构,需要细致的规划,设置时间长,并且由于互联所需的连接数量多,需要不断监测和维护。
这取决于你为你的具体使用情况选择最佳的网络拓扑结构。只要记住,你的系统需要有能力快速调整以适应网络拓扑结构的变化,而不影响服务的可用性和正常运行时间。考虑到这一点,你不应该把任何给定的节点当作不可缺少的。
6.有一个管理员
在一个非常小的系统中,也许只有一个管理员,或者在一个个人项目的背景下。除此之外,在几乎所有的现实生活场景中,分布式系统通常有一个以上的管理员。例如,想想现代的云原生系统,它由不同团队开发和管理的许多服务组成。或者考虑到使用你的系统的客户也需要管理员在他们那边管理集成。
当你设计你的系统时,你应该让不同的管理员容易(嗯,尽可能容易)地管理它。你还需要考虑到系统的弹性,并确保它不会因为不同的人与它互动而受到影响。这里有几件需要考虑的事情。
- 解耦系统组件。确保适当的解耦可以在计划中的升级导致的问题,或计划外的事件(如故障)的情况下获得更大的弹性。促进解耦(或松散耦合)的最流行的选项之一是pub/sub模式。
- 使故障排除变得容易。提供系统的可见性是非常重要的,这样管理员就可以诊断和解决可能发生的问题。返回错误信息和抛出异常,这样管理员就有了背景,可以采取适当的行动来解决问题。此外,日志、指标和追踪(通常称为可观察性的三个支柱)应该是你的系统设计的关键方面。
7.运输成本为零
就像延迟不是零一样,把数据从一个点传输到另一个点也有附带的成本,这一点是不可忽略的。
首先,网络基础设施是有成本的。服务器、网络交换机、负载均衡器、代理、防火墙、操作和维护网络,使其安全,更不用说保持其顺利运行的工作人员了--所有这些都需要钱。网络越大,财务成本就越大。
除了财务之外,我们还必须考虑架构一个分布式系统所涉及的时间、精力和困难,该系统在一个高度可用、可靠和容错的网络上工作。将这种复杂性卸载给一个专门为此目的而设计的、经过充分管理和实战检验的解决方案,往往风险更小、更简单、更经济。
除了基础设施方面的问题,在网络上传输数据也是有成本的。从应用层到传输层需要时间和CPU资源。信息需要在服务器端进行处理和序列化(marshaling),然后再传输到客户端,在客户端需要进行反序列化。如果你希望减少传输成本,避免使用XML或基于XML的选项,而使用轻量级的序列化和反序列化格式,如JSON、MessagePack或协议缓冲区(Protobuf)。
8.网络是同质化的
通常情况下,甚至你的家庭网络都不是同质的。只要有两台配置不同的设备(如笔记本电脑或移动设备)并使用不同的传输协议,就足以说明你的网络是异质的。
大多数分布式系统需要与多种类型的设备集成,适应各种操作系统,与不同的浏览器一起工作,并与其他系统互动。因此,关键是要关注互操作性,从而确保所有这些组件能够相互 "对话",尽管它们是不同的。
开放标准帮助你实现互操作性
在可能的情况下,使用被广泛支持的开放标准协议,而不是专有协议。例如,HTTP、WebSockets、SSE或MQTT。同样的逻辑适用于数据格式,像JSON或MessagePack这样的选项通常是最好的方式。
一个简短的结论:构建分布式系统是很难的
尽管分布式计算的谬论是在几十年前提出的,但它们今天仍然适用。这是因为分布式系统的特点和基本问题基本上没有变化。云计算、自动化和DevOps的兴起使事情变得更容易,有助于将这些谬论的影响降到最低--但只是降到最低,而不是完全消除。
人们可能会认为,这八个谬论可以被忽略。这无疑是很方便的,尤其是当你的系统按照预期工作,没有任何问题的时候。然而,仅仅因为你可能不会每天遇到这些谬论,并不意味着你应该否定它们。相反,意识到这些限制将帮助你设计出更好、更可靠的分布式系统。
看看技术如何发展,以及10年、20年或30年后,分布式计算的谬误是否仍有意义,这将是很有趣的。但现在,它们仍然存在。这使得建立可靠的分布式系统成为一项艰难的工程挑战。最大的谬误是不这么认为。
Ably和分布式计算的谬误
分布式计算的谬误在我们Ably公司是非常有名的。我们每天都在解决艰巨的工程问题,我们的分布式实时通信平台在架构上考虑到了可靠性,以抵消这些谬误的影响,并尽量减少这些谬误所带来的问题。
Ably由一个全球分布式边缘网络提供动力,该网络为大规模而建,旨在确保可预测的低延迟(全球平均<65ms)。我们的系统在区域和全球层面都有足够的冗余,以保证服务的连续性,即使在面临多个基础设施故障的情况下。我们的容错设计使我们能够提供合法的99.999%的正常运行时间 SLA。
如果你在尝试大规模、可靠、安全地扩展你的分布式实时通信系统时遇到问题,请联系或注册一个免费账户,看看Ably能为你做什么。