面试中常用的10种分布式数据结构和系统设计算法
声明:本文包含联盟链接;如果您通过本文提供的链接购买产品或服务,我可能会获得佣金。
你好,如果你正在准备系统设计面试,那么你应该重点学习不同的系统设计算法以及它们在分布式系统和微服务中解决的问题。
过去,我分享了6 个系统设计问题和10 个基本系统设计主题,在本文中,我将向您介绍每个开发人员都应该学习的 10 种系统设计算法和分布式数据结构。
事不宜迟,以下是10种系统设计算法和分布式数据结构,可用于解决大规模分布式系统问题:
- 一致性哈希
- MapReduce
- 分布式哈希表(DHT)
- 布隆过滤器
- 两阶段提交(2PC)
- 帕克索斯岛
- 筏
- 八卦协议
- 弦:
- CAP定理
这些算法和分布式数据结构只是可用于解决大规模分布式系统问题的众多技术中的几个例子。
顺便一提,如果您正在准备系统设计面试,并且想要深入学习系统设计,那么您还可以查看ByteByteGo、DesignGuru、Exponent、Educative 、Udemy 等网站,以及这些热门的系统设计 YouTube 频道,它们都有许多优秀的系统设计课程和教程。
面向程序员的 10 种分布式数据结构和系统设计算法
充分理解这些算法以及如何在不同场景中有效应用它们非常重要。
那么,让我们深入了解一下它们,看看它们是什么,它们是如何工作的,以及何时使用它们。
1. 一致性哈希
一致性哈希是分布式系统中用于高效地在多个节点之间分发数据的一种技术。
它用于最大限度地减少在系统中添加或删除节点时需要在节点之间传输的数据量。
一致性哈希的基本思想是使用哈希函数将每条数据映射到系统中的一个节点。每个节点都被分配一个哈希值范围,任何映射到该范围内哈希值的数据都会被分配给该节点。
当系统中添加或移除节点时,只需将分配给该节点的数据传输到另一个节点即可。这是通过使用称为虚拟节点的概念来实现的。
不是为每个物理节点分配一系列哈希值,而是为每个物理节点分配多个虚拟节点。
每个虚拟节点都被分配一个唯一的哈希值范围,任何映射到该范围内的哈希值的数据都会被分配给相应的物理节点。
当系统中添加或删除节点时,只需要重新分配受影响的虚拟节点,并将分配给这些虚拟节点的任何数据转移到另一个节点。
这样一来,系统就可以动态高效地扩展,而无需在每次添加或删除节点时都重新分配数据。
总的来说,一致性哈希提供了一种简单高效的方式,可以在分布式系统中的多个节点之间分发数据。它常用于大规模分布式系统,例如内容分发网络和分布式数据库,以提供高可用性和可扩展性。
2. MapReduce
MapReduce是一种用于在分布式系统中处理大型数据集的编程模型和框架。它最初由谷歌开发,现在被广泛应用于许多大数据处理系统中,例如Apache Hadoop。
MapReduce 的基本思想是将大型数据集分割成较小的块,将它们分布到集群中的多个节点上,并并行处理。处理过程分为两个阶段:Map 阶段和 Reduce 阶段。
在映射阶段,输入数据集由一组映射函数并行处理。每个映射函数以一个键值对作为输入,并生成一组中间键值对作为输出。
然后对这些中间键值对进行排序和键分区,并发送到 Reduce 阶段。
在归约阶段,中间键值对由一组归约函数并行处理。每个归约函数以一个键和一组值作为输入,并生成一组输出键值对。
以下示例展示了如何使用 MapReduce 来统计大型文本文件中单词的出现频率:
- Map 阶段:每个 Map 函数读取输入文件的一部分,并输出一组中间键值对,其中键是一个单词,值是该单词在该块中出现的次数。
- 洗牌阶段:对中间键值对进行排序和键分区,以便将每个单词的所有出现次数分组在一起。
- Reduce 阶段:每个 Reduce 函数接受一个单词和一组出现次数作为输入,并输出一个键值对,其中键是单词,值是该单词在输入文件中出现的总次数。
MapReduce框架负责计算的并行处理、分布式处理和容错。这使得它即使在通用硬件集群上也能高效可靠地处理大型数据集。
3. 分布式哈希表(DHT)
分布式哈希表(DHT)是一种分布式系统,它提供去中心化的键值存储。它用于点对点(P2P)网络中,以可扩展和容错的方式存储和检索信息。
在分布式哈希表 (DHT) 中,每个参与节点存储键值对的一个子集,并使用映射函数将键分配给节点。
这样,节点只需查询一小部分节点(通常是映射空间中与给定键接近的键)即可找到与给定键关联的值。
分布式哈希表(DHT)具有多种优良特性,例如自组织、容错、负载均衡和高效路由。它们常用于P2P文件共享系统、内容分发网络和分布式数据库。
Chord 协议是一种常用的分布式哈希表 (DHT) 算法,它使用基于环的拓扑结构和一致性哈希函数为节点分配键。Kademlia 协议是另一种广泛使用的 DHT 算法,它使用类似二叉树的结构来定位负责给定键的节点。
4. 布隆过滤器
布隆过滤器是一种用于高效集合成员资格测试的概率数据结构。它由伯顿·霍华德·布隆于1970年提出。
布隆过滤器是一种节省空间的概率数据结构,用于测试一个元素是否属于某个集合。它使用位数组和一组哈希函数来存储和检查元素是否存在于集合中。
向布隆过滤器添加元素的过程包括将该元素传递给一组哈希函数,这些函数会返回一组位数组中的索引。然后,这些索引在位数组中被设置为 1。
为了检查某个元素是否存在于集合中,对该元素应用相同的哈希函数,并在位数组中检查所得的索引。
如果索引处的所有位都设置为 1,则认为该元素存在于集合中。但是,如果任何一位未设置,则认为该元素不存在于集合中。
由于布隆过滤器使用哈希函数对位数组进行索引,因此存在误报的可能性,即过滤器可能会错误地指示集合中存在某个元素,而实际上该元素并不存在。
但是,可以通过调整位数组的大小和使用的哈希函数的数量来控制误报的概率。
假阴性率,即布隆过滤器未能识别出集合中实际存在的元素的概率,为零。
布隆过滤器广泛应用于网络、数据库和 Web 缓存等各个领域,以执行高效的集合成员资格测试。
5. 2 阶段承诺
两阶段提交(2PC)是一种用于确保分布式系统中事务原子性和一致性的协议。它保证参与事务的所有节点要么同时提交,要么同时回滚。
两阶段提交协议分两个阶段进行:
- 准备阶段:在准备阶段,协调节点向所有参与节点发送消息,要求它们准备提交交易。
每位参与者都会回复一条消息,表明其是否准备好进行交易。如果任何参与者无法做好准备,则会回复一条消息,表明其无法参与交易。
- 提交阶段:如果所有参与者都准备好提交,协调器会向所有节点发送消息,要求它们提交。每个参与者提交交易并向协调器发送确认信息。
如果任何参与者无法承诺,则回滚交易并向协调器发送消息,表明已回滚。
如果协调器收到所有参与者的确认,它会向所有节点发送消息,表明交易已提交。
如果协调器收到来自任何参与者的回滚消息,它会向所有节点发送消息,表明该交易已被回滚。
两阶段提交协议确保分布式系统中的所有节点即使在出现故障的情况下也能对事务的结果达成一致。
然而,它也存在一些缺点,包括延迟增加和可能出现死锁。此外,它还需要一个协调节点,而协调节点可能成为单点故障。
6. 帕克索斯
Paxos 是一种分布式共识算法,它允许一组节点即使在发生故障的情况下也能就共同值达成一致。该算法由 Leslie Lamport 于 1998 年提出,现已成为分布式系统的基础算法之一。
Paxos 算法旨在处理各种故障场景,包括消息丢失、重复、重排序和节点故障。
该算法分为两个阶段:准备阶段和接受阶段。在准备阶段,节点向所有其他节点发送准备消息,要求它们承诺不接受任何数字小于某个特定值的提议。
当大多数节点都做出承诺后,该节点即可进入接受阶段。在接受阶段,该节点会向所有其他节点发送接受消息,提出一个特定的值。
如果大多数节点都回复了接受消息,则该值被视为已接受。
Paxos 是一种复杂的算法,它有多种变体和优化版本,例如 Multi-Paxos、Fast Paxos 等。
这些改进旨在减少消息交换次数、优化算法延迟并减少参与共识所需的节点数量。Paxos 广泛应用于分布式数据库、文件系统和其他需要高容错性的分布式系统中。
7. 木筏
Raft 是一种共识算法,旨在确保分布式系统的容错性。它用于维护一个复制日志,该日志存储集群中多个节点的状态变化序列。
Raft 通过选举领导者来达成共识,领导者负责协调节点之间的通信,并确保集群中日志的一致性。
Raft算法由三个主要部分组成:领导者选举、日志复制和安全机制。在领导者选举阶段,集群中的节点使用随机超时机制选举出领导者。
领导者随后通过接收来自客户端的状态变更并将其复制到集群中的各个节点来协调日志复制。节点也可以向领导者请求日志条目,以确保集群内数据的一致性。
Raft 的安全组件确保算法能够抵御故障,并确保集群中的日志保持一致。
Raft 通过确保在任何给定时间只能有一个节点作为领导者,并强制执行集群中日志条目的严格排序来实现安全性。
Raft协议广泛应用于分布式系统中,以提供容错性和高可用性。它常用于需要强一致性保证的系统中,例如分布式数据库和键值存储。
8. 八卦
gossip 协议是一种点对点通信协议,用于分布式系统中快速有效地传播信息。
它是一种概率协议,允许节点以去中心化的方式与邻居交换有关其状态的信息。
该协议的名称来源于它像谣言或八卦一样传播信息的方式。
在八卦协议中,节点随机选择一组其他节点进行信息交换。当一个节点从另一个节点接收到信息时,它会将该信息转发给其邻居节点的子集,如此循环往复。
随着时间的推移,整个网络会感知到这些信息,因为它会从一个节点传播到另一个节点。
Gossip协议的关键优势之一是其容错性。由于该协议依赖于概率通信而非中央权威机构,即使某些节点发生故障或退出网络,它也能继续运行。
这使其成为分布式系统中的有用工具,因为在分布式系统中,可靠性至关重要。
Gossip 协议已被用于各种应用,包括分布式数据库、点对点文件共享网络和大规模传感器网络。
它们特别适用于需要在大量节点上快速高效地传播信息的应用。
9. Chrod
Chord 是一种分布式哈希表 (DHT) 协议,用于去中心化的点对点 (P2P) 系统。它提供了一种高效的方法,可以根据节点标识符在 P2P 网络中定位节点(或节点集)。
Chord 允许 P2P 系统扩展到非常多的节点,同时保持较低的开销。
在Chord网络中,每个节点都被分配一个标识符,该标识符可以是任意m位数字。节点排列成一个环,并按其标识符顺时针方向排序。
每个节点负责一组键,这些键可以是 0 到 2^m-1 范围内的任何值。
为了在网络中找到一个密钥,节点首先计算其哈希值,然后联系标识符是该哈希值顺时针方向第一个后继节点的节点。
如果后继节点没有所需的密钥,它会将请求转发给其后继节点,依此类推,直到找到密钥为止。这个过程称为指状查找,通常需要发送对数级数量的消息才能找到所需的节点。
为了保持网络的一致性,Chord 使用了一种称为指状表的协议,该协议存储有关网络中其他节点的信息。
每个节点维护一个指状表,其中包含其在环中沿距离递增方向的后继节点的标识符。这使得节点能够高效地定位网络中的其他节点,而无需维护所有节点的完整列表。
Chord 还提供了在节点加入或离开网络时保持数据一致性的机制。当一个节点加入网络时,它会通知其直接后继节点,后者会相应地更新其指状表。
当一个节点离开网络时,它的密钥会被转移到它的后继节点,后继节点会更新它的指表以反映该节点的离开。
总的来说,Chord 提供了一种高效且可扩展的方式,使用简单且去中心化的协议在 P2P 网络中定位节点。
10. CAP 定理
CAP 定理,又称布鲁尔定理,是分布式系统中的一个基本概念,它指出分布式系统不可能同时保证以下三个属性:
- 一致性:每次读取都会收到最近一次写入的内容或错误信息。
- 可用性:每个请求都会收到响应,但不保证响应中包含最新版本的信息。
- 分区容错性:即使发生网络分区,系统也能继续运行并提供一致且可用的服务。
换句话说,分布式系统只能提供上述三个特性中的两个。
该定理表明,在发生网络分区的情况下,分布式系统必须在一致性和可用性之间做出选择。
例如,在分区系统中,如果一个节点无法与另一个节点通信,则它必须返回错误或提供可能已过时的响应。
CAP 定理对分布式系统的设计具有重要意义,因为它要求开发人员在一致性、可用性和分区容忍度之间做出权衡。
结论
以上就是2023年你可以学习到的系统设计数据结构、算法和协议的基本内容。总之,系统设计是软件工程师的一项基本技能,尤其对于那些从事大规模分布式系统开发的软件工程师而言更是如此。
这十种算法、数据结构和协议为解决复杂问题和构建可扩展、可靠的系统奠定了坚实的基础。通过理解这些算法及其优缺点,您可以在设计和实现系统时做出明智的决策。
此外,学习这些算法可以帮助你准备系统设计面试,并提升解决问题的能力。但是,需要注意的是,这些算法只是一个起点,你应该随着技术的进步不断学习和调整。
顺便一提,如果您正在准备系统设计面试,并且想深入学习系统设计,那么您还可以查看ByteByteGo、DesignGuru、Exponent、Educative 、 Udemy 和YouTube 等网站。
此外, DesignGuru提供了一个不错的系统设计模板,您可以用来回答面试中任何关于系统设计的问题。它突出了关键的软件架构组件,并能帮助您清晰地表达您的知识。
祝你系统设计面试一切顺利!
文章来源:https://dev.to/somadevtoo/10-distributed-data-structs-and-system-design-algorithms-for-interviews-a4j







