五大分布式系统设计模式
分布式应用程序是现代软件开发行业的基石。它们对云存储服务至关重要,并使大规模 Web 应用程序能够保持响应迅速。程序员在构建这些系统时,需要一些基本的构建模块作为起点,并使用共享的语言进行沟通。
分布式系统设计模式的价值就在于此。虽然有时会被过度使用,但设计模式是招聘人员正在寻找的关键技能,也是在高级系统设计面试中脱颖而出的必要条件。
今天,我们将探讨 5 种顶级分布式系统设计模式,帮助您了解它们的优点、缺点以及何时使用它们。
今天我们将讨论以下内容:
轻松应对高级系统设计问题
练习分布式系统方面的常见问题和设计模式,以便在下次系统设计面试中运用。
什么是分布式系统设计模式?
设计模式是经过实践检验的系统构建方法,每种方法都适用于特定的用例。它们并非具体的实现方式,而是构建系统的抽象方法。大多数设计模式都经过众多开发者多年的开发和更新,这意味着它们通常是非常高效的起点。
设计模式是构建模块,它允许程序员利用现有知识,而不是每次都从零开始构建系统。它们还创建了一套系统设计的标准模型,帮助其他开发人员了解他们的项目如何与给定系统交互。
创建型设计模式为构建新对象提供基准。结构型模式定义了解决方案的整体结构。行为型模式描述了对象以及它们之间的通信方式。
分布式系统设计模式是用于开发分布式系统的设计模式。分布式系统本质上是由多个计算机和数据中心组成的集合,它们共同构成一台计算机供最终用户使用。这些分布式设计模式概述了软件架构,包括不同节点之间的通信方式、各节点处理的任务以及不同任务的处理流程。
这些模式广泛应用于大规模云计算和可扩展微服务软件系统的分布式系统架构设计中。
分布式设计模式的类型
大多数分布式设计模式根据其所处理的功能可分为以下三类之一。
- 对象通信:描述系统中不同组件之间通信的消息传递协议和权限。
- 安全性:处理机密性、完整性和可用性问题,以确保系统免受未经授权的访问。
- 事件驱动:描述系统事件的产生、检测、消费和响应的模式。
1. 命令查询职责分离(CQRS)
CQRS模式专注于分离分布式系统的读写操作,以提高可扩展性和安全性。该模型使用命令将数据写入持久存储,并使用查询来定位和获取数据。
这些操作由指挥中心处理,指挥中心接收用户请求。然后,指挥中心获取数据并进行必要的修改,保存数据,并通知读取服务。读取服务随后更新读取模型,将更改显示给用户。
优势:
- 通过委派任务来降低系统复杂性
- 强制执行业务逻辑和验证之间的明确分离
- 有助于按其作用对流程进行分类
- 减少对共享数据的意外更改次数
- 减少对数据具有修改权限的实体数量
缺点:
- 需要命令和读取模型之间持续不断的来回通信
- 发送高吞吐量查询时可能会导致延迟增加
- 服务流程之间没有沟通渠道
用例
CQRS 最适合数据密集型应用,例如 SQL 或 NoSQL 数据库管理系统。它也适用于数据密集型的微服务架构。由于其区分写入者和读取者的特性,CQRS 非常适合处理有状态应用,因为它有助于实现不可变状态。
2. 两阶段承诺(2PC)
2PC 与 CQRS 在事务处理方式和对中央命令的依赖方面类似,但分区处理方式不同,它根据分区类型和完成阶段进行处理。2PC 分为两个阶段:准备阶段和提交阶段。在准备阶段,中央控制器指示服务准备数据;在提交阶段,中央控制器指示服务发送已准备好的数据。
在双工系统中,所有服务默认处于锁定状态,这意味着它们无法发送数据。锁定状态下,服务会完成准备阶段,以便在解锁后即可发送数据。协调器会逐个解锁服务并请求其数据。如果某个服务尚未准备好提交数据,协调器则会转而请求其他服务。所有准备就绪的数据发送完毕后,所有服务将解锁,等待协调器发送新的任务。
2PC 本质上确保一次只能运行一个服务,这使得该过程比 CQRS 更具抵抗力和一致性。
优势
- 由于并发请求数量少,因此具有稳定性和抗错性。
- 可扩展性强,既能轻松处理大数据池,也能轻松处理来自单台机器的数据。
- 允许同时进行隔离和数据共享
缺点
- 由于其同步特性,它不具备容错能力,容易出现瓶颈和阻塞。
- 比其他设计模式需要更多资源
用例
2PC 最适合处理高风险交易操作的分布式系统,这类系统更注重准确性而非资源效率。它具有较强的抗错能力,即使在大规模系统中,也能轻松追踪错误。
继续学习分布式系统方面的知识。
掌握分布式系统知识是现代招聘人员的首要考虑因素。通过实践练习和内部技巧,为你的下一次系统设计面试做好准备。Educative 的文字课程能让你获得所需的经验,助你一次性找到下一份工作。
3. 传奇
Saga 是一种异步模式,它不使用中央控制器,而是完全通过服务之间的通信来实现。这克服了之前介绍的同步模式的一些缺点。
Saga 使用事件总线 (Event Bus) 来实现微服务系统中各个服务之间的通信。事件总线在服务之间发送和接收请求,每个参与的服务都会创建一个本地事务。然后,参与的服务各自发出一个事件供其他服务接收。其他服务都会监听这些事件。第一个接收到事件的服务将执行所需的操作。如果该服务未能完成操作,则会将事件转发给其他服务。
这种结构与两阶段交付(2PC)设计类似,都是在某个服务无法完成任务时循环使用其他服务。然而,Saga 移除了中央控制元素,以便更好地管理流程并减少所需的来回通信次数。
优势
- 单个服务可以处理更长时间的交易。
- 由于其去中心化特性,非常适合分布式系统。
- 通过服务间的点对点通信减少瓶颈
缺点
- 异步自治使得追踪哪些服务正在执行哪些具体任务变得困难。
- 由于复杂的编排,调试起来很困难。
- 与以往模式相比,服务隔离程度更低
用例
Saga 的去中心化架构非常适合可扩展的无服务器函数,这些函数可以同时处理大量并行请求。AWS 在许多函数(例如 Step 函数和 Lambda 函数)中都采用了基于 Saga 的设计。
4. 复制负载均衡服务 (RLBS)
RLBS模式是最简单且最常用的设计模式。从最基本的层面来说,它由多个相同的服务组成,所有服务都向中央负载均衡器汇报。每个服务都能够处理任务,并且在发生故障时可以进行复制。负载均衡器接收来自最终用户的请求,并使用轮询方式或有时使用更复杂的路由算法将请求分发给各个服务。
重复的服务确保应用程序对用户请求保持高可用性,并且在某个服务实例发生故障时可以重新分配工作。
RLBS 通常与 Azure Kubernetes 一起使用,Azure Kubernetes 是微软开发的一种开源容器编排技术,可根据工作流提供自动服务扩展。
优势
- 从最终用户的角度来看,性能始终如一
- 能够快速从故障服务中恢复
- 具有高度可扩展性,可添加更多服务
- 非常适合并发环境
缺点
- 基于负载均衡算法的性能不稳定
- 管理服务需要投入大量资源
用例
RLBS 非常适合全天工作负载不稳定但必须保持低延迟的面向用户的系统,例如 Netflix 或 Amazon Prime 等娱乐网络应用程序。
5. 分布式服务
另一种替代基于副本的设计方案是创建一系列服务,每个服务只处理特定类型的请求。这被称为“分片”,因为它将请求流分割成多个优先级不同的部分。例如,您可以创建一个分片服务来接收所有缓存请求,而另一个分片服务则只处理高优先级请求。负载均衡器会在收到请求时对其进行评估,并将其分发到相应的分片进行处理。
分片服务通常用于构建有状态服务,因为有状态的大小通常太大,单个无状态容器无法容纳。分片允许你扩展单个分片以满足有状态的大小需求。
分片服务还能让您更快地处理高优先级请求。专用于高优先级请求的分片始终可用,可以在请求到达时立即处理,而无需将其放入队列。
优势
- 允许您根据常见请求扩展分片
- 易于确定请求的优先级
- 由于自然排序,因此易于调试
缺点
- 维护多个分片可能需要消耗大量资源。
- 如果分片使用比例失调,会导致性能下降。
用例
当您的系统接收到的请求类型存在可预测的不平衡,但某些请求具有优先级时,分片服务是最佳选择。
接下来要学什么?
分布式系统设计模式是任何成功的后端系统不可或缺的一部分。然而,这些只是专业软件工程师使用的几种模式。
接下来你需要学习的一些模式包括:
- 边车模式
- 预写式日志
- 裂脑模式
- 暗示交接
- 读取修复
为了帮助您掌握这些高级系统设计模式,Educative 推出了《深入理解高级系统设计面试》课程。本课程将通过深入的讲解和实践练习,引导您了解最热门的高级系统设计面试题。您将学习到高级系统工程师所需的所有基本设计模式。课程结束时,您将拥有运用顶级行业招聘人员最常考察的所有设计模式的实际经验。
学习愉快!