软件架构和系统设计:总体情况和资源指南

大家好

今天,我们提供 Tugberk Ugurlu 的一篇文章的翻译供您参考,他致力于以相对较小的篇幅概述设计现代软件系统的原则。 以下是作者对自己的总结:

软件架构和系统设计:总体情况和资源指南
由于截至 2019 年,在一篇 habro 文章中绝对不可能涵盖架构模式 + 设计模式这样一个庞大的主题,因此我们不仅推荐 Uruglu 先生本身的文本,还推荐他善意包含在其中的众多链接。 如果您喜欢,我们将发布有关分布式系统设计的更加专业化的文本。

软件架构和系统设计:总体情况和资源指南

Снимок 艾萨克·史密斯 来自 Unsplash

如果你从未面临过从头开始设计软件系统这样的挑战,那么当开始这样的工作时,有时甚至不知道从哪里开始。 我相信你首先需要划定界限,以便你对自己要设计的东西有或多或少的自信,然后卷起袖子在这些界限内工作。 作为起点,您可以选择一种产品或服务(最好是您真正喜欢的产品或服务)并弄清楚如何实施它。 您可能会惊讶于这个产品看起来多么简单,而它实际上包含多么复杂。 不要忘记: 简单 - 通常很复杂,没关系。

我认为我能给任何开始设计系统的人最好的建议是:不要做任何假设! 从一开始,您就需要指定有关该系统的已知事实以及与之相关的期望。 以下是一些可以帮助您开始设计的好问题:

  • 我们要解决的问题是什么?
  • 与我们的系统交互的用户峰值数量是多少?
  • 我们将使用什么模式来写入和读取数据?
  • 预期的失败情况是什么,我们将如何处理它们?
  • 对系统一致性和可用性的期望是什么?
  • 您在工作时是否需要考虑与外部验证和监管相关的任何要求?
  • 我们将存储哪些类型的敏感数据?

这些只是对我和我多年来参与的专业活动的团队都有用的几个问题。 如果您知道这些问题的答案(以及与您必须工作的环境相关的任何其他问题),那么您可以逐渐深入研究问题的技术细节。

设置初始级别

这里的“基线”是什么意思? 事实上,在我们这个时代,软件行业的大多数问题“可以”用现有的方法和技术来解决。 因此,通过驾驭这种情况,当你面临其他人必须在你之前解决的问题时,你就能取得一定的领先优势。 不要忘记,编写程序是为了解决业务和用户问题,因此我们力求以最直接、最简单(从用户的角度)的方式解决问题。 为什么记住这一点很重要? 也许在你的坐标系中,你喜欢为所有问题寻找独特的解决方案,因为你想,“如果我到处遵循模式,我是什么样的程序员”? 实际上, 这里的艺术是决定在哪里做什么。 当然,我们每个人都会不时地处理独特的问题,每个问题都是真正的挑战。 然而,如果我们的初始水平已经明确,那么我们就知道该把精力花在哪里:寻找现成的选项来解决摆在我们面前的问题,或者进一步研究它并获得更深入的理解。

我想我能够让您相信,如果专家自信地理解某些出色的软件系统的架构组件是什么,那么这些知识对于掌握架构师的艺术并在该领域打下坚实的基础是不可或缺的。

好吧,那么从哪里开始呢? U 唐娜·玛蒂娜 GitHub 上有一个存储库,名为 系统设计入门,从中您可以学习如何设计大型系统,并为有关该主题的面试做好准备。 存储库有一个包含示例的部分 真实的架构,其中特别考虑了他们如何设计系统 一些知名公司例如 Twitter、Uber 等。

然而,在继续讨论本材料之前,让我们仔细看看我们在实践中面临的最重要的架构挑战。 这很重要,因为您必须指定一个顽固且多方面问题的许多方面,然后在给定系统中有效的法规框架内解决它。 杰克逊·加巴德Facebook 前员工写道 关于系统设计面试的 50 分钟视频,他分享了自己筛选数百名申请人的经验。 虽然该视频重点关注大型系统设计以及在寻找此类职位候选人时非常重要的成功标准,但它仍然可以作为设计系统时最重要的事情的综合资源。 我也建议 概括 这个视频。

建立有关存储和检索数据的知识

通常,您关于如何长期存储和检索数据的决定会对系统性能产生重大影响。 因此,您必须首先了解系统的预期写入和读取特性。 然后你需要能够评估这些指标并根据所做的评估做出选择。 然而,只有了解现有的数据存储模式,您才能有效地应对这项工作。 原则上,这意味着与以下方面相关的扎实知识 数据库选择.

数据库可以被认为是具有极高可扩展性和持久性的数据结构。 因此,在选择特定数据库时,数据结构的知识应该对您非常有用。 例如, Redis的 是一个支持各种类型值的数据结构服务器。 它允许您使用列表和集合等数据结构,并使用众所周知的算法读取数据,例如, LRU,以持久且易于访问的方式组织此类工作。

软件架构和系统设计:总体情况和资源指南

Снимок 塞缪尔·泽勒 来自 Unsplash

一旦您对各种数据存储模式有了足够的了解,就可以继续研究数据一致性和可用性。 首先,你需要了解 CAP定理 至少在一般意义上,然后通过仔细研究已建立的模式来完善这些知识 一致性 и 可用性。 通过这种方式,您将深入了解该领域,并了解读取和写入数据实际上是两个截然不同的问题,每个问题都有其独特的挑战。 借助一些一致性和可用性模式,您可以显着提高系统性能,同时确保数据顺利流向应用程序。

最后,结束关于数据存储问题的讨论,我们还应该提到缓存。 它应该在客户端和服务器上同时运行吗? 您的缓存中将包含哪些数据? 为什么? 如何组织缓存失效? 是否会定期、以一定的时间间隔进行? 如果是,多久一次? 我建议开始研究这些主题 下一节 上述系统设计入门。

沟通模式

系统由各种组件组成; 这些可能是在同一物理节点内运行的不同进程,也可能是在网络不同部分运行的不同计算机。 您网络中的某些资源可能是私有的,但其他资源应该是公开的,并对从外部访问它们的消费者开放。

需要保证这些资源之间的通信,以及整个系统与外界的信息交换。 在系统设计的背景下,我们再次面临着一系列新的、独特的挑战。 让我们看看它们有何用处 异步任务流,什么p多种通讯模式可供选择.

软件架构和系统设计:总体情况和资源指南

Снимок 托尼·斯托达德 来自 Unsplash

在组织与外界的沟通时,总是非常重要的 安全,这一规定也需要认真对待并积极推行。

连接分布

我不确定将这个主题放在一个单独的部分对每个人来说都是合理的。 尽管如此,我将在这里详细介绍这个概念,并且我相信术语“连接分布”对本节中的材料进行了最准确的描述。

系统是由许多组件正确连接而成的,它们之间的通信通常是根据已建立的协议(例如 TCP 和 UDP)来组织的。 然而,这些协议本身通常不足以满足现代系统的所有需求,现代系统通常在高负载下运行,并且高度依赖于用户需求。 通常需要找到分配连接的方法来应对系统上如此高的负载。

该分布基于众所周知的 域名系统 (DNS)。 这样的系统允许域名转换(例如加权循环法和基于延迟的方法)来帮助分配负载。

负载均衡 这是非常重要的,实际上我们今天处理的每个大型互联网系统都位于一个或多个负载平衡器后面。 负载均衡器有助于在多个可用实例之间分配客户端请求。 负载均衡器有硬件和软件两种形式,但在实践中,您更经常需要处理软件负载均衡器,例如 HAProxy的 и 电子负载均衡器. 反向代理 从概念上讲也与负载均衡器非常相似,尽管第一个和第二个之间存在一个范围 明显的差异。 根据您的需求设计系统时必须考虑这些差异。

您还应该了解 内容交付网络 (CDN)。 CDN 是一个全球分布式代理服务器网络,它从地理位置更靠近特定用户的节点传递信息。 如果您使用用 JavaScript、CSS 和 HTML 编写的静态文件,则最好使用 CDN。 此外,提供流量管理器的云服务如今很常见,例如, Azure 流量管理器,为您提供全球分发并减少处理动态内容时的延迟。 但是,当您必须使用无状态 Web 服务时,此类服务通常很有用。

我们来谈谈业务逻辑。 构建业务逻辑、任务流和组件

因此,我们设法讨论了系统的各个基础设施方面。 最有可能的是,用户甚至没有考虑系统的所有这些元素,坦率地说,根本不关心它们。 用户感兴趣的是与系统交互是什么样的,通过这样做可以实现什么,以及系统如何执行用户命令,它如何处理用户数据以及如何处理用户数据。

正如本文标题所示,我将讨论软件架构和系统设计。 因此,我不打算涵盖描述如何创建软件组件的软件设计模式。 然而,我越想越觉得软件设计模式和架构模式之间的界限非常模糊,而且这两个概念是紧密相关的。 我们举个例子 活动登记 (事件溯源)。 一旦采用这种架构模式,它将影响系统的几乎每个方面:数据的长期存储、系统中采用的一致性级别、系统中组件的形状等等。 因此,我决定提及一些与业务逻辑直接相关的架构模式。 尽管本文必须限于一个简单的列表,但我鼓励您熟悉它并思考与这些模式相关的想法。 给你:

协作方法

您极不可能在项目中作为参与者完全负责系统设计过程。 相反,您很可能必须与在您的任务之内和之外工作的同事进行互动。 在这种情况下,您可能需要与同事一起评估所选的技术解决方案,确定业务需求并了解如何最好地并行化任务。

软件架构和系统设计:总体情况和资源指南

Снимок 卡莱迪科 来自 Unsplash

第一步是对您想要实现的业务目标以及您必须处理哪些移动部分形成准确和共同的理解。 组建模技术,特别是 风暴事件 (事件风暴)有助于显着加快此过程并增加成功的机会。 这项工作可以在概述之前或之后完成 您的服务范围,然后随着产品的成熟而深化。 根据此处将达到的一致性级别,您还可以制定 通用语言 针对您工作的有限环境。 当您需要谈论系统架构时,您可能会发现它很有用 型号C4建议的 西蒙·布朗,特别是当你需要了解你需要深入研究问题的细节,想象你想要沟通的事情时。

在这个主题上可能还有另一种成熟的技术,其用处不亚于领域驱动设计。 然而,我们以某种方式回归到对主题领域的理解,因此该领域的知识和经验 领域驱动设计 应该对你有用。

来源: habr.com

添加评论