分布式系统的模式

分布式系统给程序带来了特殊的挑战。它们通常要求我们拥有多个数据副本,这些副本需要保持同步。但是,我们不能依靠处理节点可靠地工作,并且网络延迟很容易导致不一致。尽管如此,许多组织仍依赖一系列核心分布式软件来处理数据存储,消息传递,系统管理和计算功能。这些系统面临共同的问题,可以通过类似的解决方案解决。本文将这些解决方案识别并开发为模式,通过它们我们可以建立对如何更好地理解,交流和教授分布式系统设计的理解。 下面是来自Unmesh Joshi的文章,Unmesh Joshi是ThoughtWorks的首席顾问。他是一位软件体系结构狂热者,他认为,理解分布式系统的原理与近十年来理解Web体系结构或面向对象的编程一样重要。希望他的见解可以为我们更好的理解分布式系统。 原文来自:https://martinfowler.com/articles/patterns-of-distributed-systems/ 目录: 在过去的几个月中,我一直在ThoughtWorks上进行有关分布式系统的研讨会。举办研讨会时面临的主要挑战之一是如何将分布式系统的理论映射到Kafka或Cassandra等开源代码库,同时保持讨论的通用性足以涵盖广泛的解决方案。模式的概念提供了一个不错的出路。 模式结构本质上使我们能够专注于特定问题,从而很清楚地说明了为什么需要特定的解决方案。然后,解决方案描述使我们能够给出一个代码结构,该结构足够具体以显示实际的解决方案,但又足够通用以涵盖广泛的变体。模式技术还允许我们将各种模式链接在一起以构建一个完整的系统。这为讨论分布式系统实现提供了很好的词汇。 接下来是在主流开源分布式系统中观察到的第一组模式。我希望这些模式集对所有开发人员都有用。 当今的企业体系结构充满了按自然分布的平台和框架。如果我们看到今天在典型的企业体系结构中使用的框架和平台的示例列表,它将看起来像以下内容: 所有这些本质上都是“分布式的”。分发系统意味着什么?有两个方面: 当多个服务器参与存储数据时,有几种方法可能会出错。上述所有系统都需要解决这些问题。这些系统的实现对这些问题有一些重复性的解决方案。以一般形式理解这些解决方案有助于理解这些系统的广泛实现,并且在需要构建新系统时也可以作为很好的指导。输入模式。 克里斯托弗·亚历山大(Christopher Alexander)提出的概念模式(Patterns)在软件社区中被广泛接受,用于记录用于构建软件系统的设计构造。模式提供了一种结构化的方式来查看问题空间,而解决方案可以多次看到并经过验证。使用模式的一种有趣方式是能够以模式序列或模式语言的形式将多个模式链接在一起,这为实现“整个”或完整的系统提供了一些指导。将分布式系统视为一系列模式是一种获得深入了解其实现的有用方法。 当数据存储在多个服务器上时,可能会出错。 进程可以随时崩溃。由于硬件故障或软件故障。进程崩溃的方式有很多种。 底线是,如果进程负责存储数据,则必须将其设计为对存储在服务器上的数据提供持久性保证。即使进程突然崩溃,它也应保留所有已通知用户已成功存储的数据。根据访问方式,不同的存储引擎具有不同的存储结构,从简单的哈希映射到复杂的图形存储。由于将数据刷新到磁盘是最耗时的操作之一,因此无法将每次对存储的插入或更新都刷新到磁盘。因此,大多数数据库具有内存存储结构,这些存储结构仅定期刷新到磁盘。如果进程突然崩溃,则可能会丢失所有数据。 一种称为预写日志的技术用于解决这种情况。服务器将每个状态更改作为命令存储在硬盘上的仅附加文件中。附加文件通常是非常快速的操作,因此可以在不影响性能的情况下完成文件的添加。单个日志按顺序附加,用于存储每个更新。在服务器启动时,可以重播日志以再次建立内存状态。 这提供了耐用性保证。即使服务器突然崩溃,然后重新启动,数据也不会丢失。但是,在备份服务器之前,客户端将无法获取或存储任何数据。因此,如果服务器发生故障,我们将缺乏可用性。 一种显而易见的解决方案是将数据存储在多个服务器上。因此,我们可以在多个服务器上复制预写日志。…