架构设计系列之分布式系统 11,12,13,14,15,16,17,18

架构设计系列之分布式系统 11:架构理论

第二部分 引   言

前面的几部分介绍了关于软件架构设计的基本概念、基本理论、演化史、常见架构相关的内容,同时还专门介绍了架构设计相关的组织文化保障、遵循定律以及一个程序员应该如何转型成为架构师,此外还应答了朋友们咨询的问题,那就是前端架构和后端架构的区别以及如何提升前端架构设计能力。

从本篇开始进入到第二部分内容,我先重点讲解分布式系统架构的前因后果和相关联的内容以及在分布式系统架构设计中的方法论、工具和框架以及一些经典场景的解决方案,欢迎关注!

01

前言

在当今互联网时代,分布式系统架构成为推动现代软件开发和服务部署的核心理念。

分布式系统在解决单点故障、提高系统可扩展性和确保高可用性方面发挥着至关重要的作用。

背景

随着互联网应用的不断发展,传统的集中式系统面临着越来越多的挑战。单一服务器的性能瓶颈、系统的可维护性、服务的高可用性等问题愈发凸显。分布式系统架构的出现,为解决这可问题提供了新的思路和技术方案。

定义

分布式系统是指多台计算机通用网络协同工作,共同完成一个系统的设计、实现和运行。分布式系统的核心在于将系统的各个组成部分分散到不同的节点上,通用网络进行通信和协同工作,从而形成一个整体的系统。

重要性

分布式系统在当今互联网时代具备极大的重要性,主要体现在以下几个方面:

高可用性和容错性

分布式系统能够将服务分散到多个节点,当一个节点发生故障时,其他节点依旧可以提供服务,从而确保系统的高可用性和容错性。

横向扩展性

随着企业业务的增长,分布式系统可以通过添加更多的节点来实现横向扩展,提高系统的性能和负载能力。

资源利用效率

分布式系统能够更有效地利用资源,分摊压力,提高整体效率,这包括计算资源、存储资源和网络资源等。

灵活性和可维护性

分布式系统采用模块化设计,组件之间相对独立,便于维护和升级,同时也可以更容易适应不同的业务需求和变化。

接下来的内容将会研究分布式系统的各个方面,涵盖关键技术、设计原则、实际应用案例等,帮助大家一起更好地理解和应用分布式系统。

02

分布式系统基础

在背景部分的定义部分已经讲了分布式系统的定义,再一起回顾下:

分布式系统是由多台计算机通用网络连接,协调完成一个共同的任务或提供一个服务的系统。在分布式系统中,各个计算机节点相互协作,共同为用户提供服务,形成一个统一的、虚拟的系统。

特性

从对分布式系统的概念研究上,可以看到,它具备以下特性:

并发性

分布式系统中的多个节点可以并行地执行任务,提高了系统整体的并发性能。

不确定性

由于网络延迟、节点故障等原因,分布式系统中的节点之间的通信是不确定的,也同时增加了系统的复杂性。

透明性

分布式系统通过透明性隐藏了底层的网络和计算机节点细节,使得用户感受不到系统的分布式特性。

难以实现一致性

由于网络的不确定性,实现全局一致性成为分布式系统架构设计中的难点和挑战。

对分布式系统进行架构设计的必要性

01

处理大规模数据

随着数据规模的增大,单一计算机处理效率下降,分布式系统通过分散数据存储和计算,提高了系统的处理能力。

02

提高系统可用性

分布式系统通过将服务分布到多个节点,即使某个节点发生故障,其他节点依旧能提供服务,提高系统的可用性。

03

实现横向扩展

分布式系统能够通过增加节点来实现横向扩展,应对业务的快速增长。

04

增加系统的灵活性

分布式系统采用模块化设计,组件之间相对独立,便于维护和升级,增加了系统的灵活性。

03

设计理论

从对分布式系统的概念进行分析,针对他的显著特点以及存在的一些挑战,需要针对分布式系统进行专业的架构设计,那这个思考设计的过程,它是要遵循分布式系统的基本设计理论的。

CAP

CAP 理论是分布式系统架构设计中的基本原则,它明确说明在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)三者不可兼得,在读写数据场景中,只能保证两个,另外一个必须被舍弃。

1

C:一致性

要求所有节点在同一时刻能看到相同的数据,如果一个节点对数据进行了更新,那其他节点读取到的也应该是更新后的数据。

2

A:可用性

要求在任何请求中,系统都能够返回一个非错误的响应,在这个要求下,并没有要求一定是得到正确的结果,但是不能超时、不能出错。

3

P:分区容忍性

要求即使系统中出现网络分区部分节点之间的通信终端,系统依旧可以继续运行,并且可以持续提供功能服务,履行其系统职责。

CAP 理论给出了三者只能选择两者的设计原则建议,但是在分布式系统实际设计的过程中,和这个建议是会存在一些偏差的。

系统使用网络提供服务,因为网络本身是无法做到 100% 可靠,那 P 是一个必然的选择,在这个前提下,就只能再选择一个 C 或者 A 了,因此在具体实践中,不太可能出现 CA 的组合,只存在 CP 组合或者 AP 组合。

图片

1

CP 组合

如上图所示,选择 CP 组合,为了保证数据一致性,在服务节点 1 和服务节点 2 上有一份数据因为网络等原因,导致版本不一致,分别为 V2.0 和 V1.0 ,此时用户端访问服务节点 2, 因为数据未到最新的 V2.0,在 CP 组合的设计原则指导下,此时需要对用户端的请求报错,舍弃 A。

2

AP 组合

如上图所示,为了保证 A,同样是服务节点 1 和服务节点 2 因为网络等原因导致数据版本不一致,针对用户端请求,是需要服务节点 2 把不一致的数据版本 V1.0 返回给用户端的,此时丧失了 C,这就是 AP 组合的设计思想。虽然数据版本还是 V1.0,但是不影响它正常返回正确结果(结合实际场景虽然是不合理的数据)。

Tips

从上述 CP 组合和 AP 组合流程的分析,不难看出,CAP 所聚焦的并不是整个系统,而是在系统中流转处理的数据。而在我们实际系统设计的场景中,一个系统承载的数据类型是复杂多样的,针对不同类型的数据可能在 CP、AP 的选择是不一样的,因此在具体设计的时候不要把 CAP 限制在系统层面,而是要落到具体的数据场景中。

比如在 AI 数据标注服务系统的场景中,标注员信息、标注项目管理信息等场景类型的数据选择 AP 组合即可,但是对流转中的标注任务数据,是要选择 CP 组合的。

之所以选择一个相对小领域的数据标注场景,是因为笔者当前在这个领域的公司就职,用实际工作的场景对自己部门的同事们更有贴切的体感。

BASE

BASE 理论是对传统 ACID 原则的一种补充,它更适应分布式系统的思想。指基本可用(Basically Available)、软状态(Soft State)、最终一致性(Eventual Consistency),核心思想是即使数据无法做到强一致性(CAP 中的 C),但应用可以采用适合的方式到达最终一致性。

基本可用

是指系统出现故障时,依旧能够保证基本的可用性,不要求所有可用性,可舍弃部分可用性。比如平时我们经常说的,要保障核心主流程可用。

在这个要求的指导下,是需要架构师在设计架构的时候,明确各个业务范围和重要性,即在极端情况下,可以牺牲哪个业务场景,又要死保哪个业务场景。这是一个非常有困难极具挑战的任务。

比如在我们设计数据标注系统的时候,会降项目管理的基本功能作为次要功能,而标注工具的操作和标注的主流程就是我们要死保的功能。

软状态

是指系统的状态可以有一段时间的不一致,系统会在一定时间内达到一致状态。

最终一致性

是指系统保证在一段时间内,所有副本的数据都会达到一致状态。

比如在我们设计的数据标注系统中,当标注员针对一份点云数据进行标注时,可能会出现成千上万个 Label,我们需要实时统计他的工作量,当前我们选择了在工程侧通用 Kafka 通道连接大数据技术体系,在大数据技术域中进行转换计算等工作,但是如果出现网络延迟、代码问题会出现实时流程丢失极少量数据的情况导致工作量的不准确,结合实际业务场景,工作量的实时指标仅做参考,最终决定结算流程的是项目完成后的最终统计数据。因此,我们设计了离线数据回补流程和项目结束后的数据对账流程,来保证用于结算的数据最终在完成的那一刻是一致准确的。

BASE 和 CAP 的关系

从两个理论的讲解上可以推导出 BASE 理论实际是对 CAP 理论中 AP 组合的一个补充理论。

CP 组合 & BASE

从严格意义上,因为网络延迟的存在,在那极端的延迟实践间隔中,是无法达到真正的 CP 的,而我们在实际选择 CP 组合设计数据场景方案的时候,往往是符合 BASE 理论中最终一致性的要求。而非实时一致性。

AP 组合 & BASE

AP 组合舍弃了 C,但它不是不要 C,而是一段时间后达到 C,所以 AP 组合它也是要求的最终一致性。

从上述对 CP 和 AP 组合和 BASE 理论的关系,我们可以得出结论:在分布式系统中,严格意义上讲,是追求保障数据的最终一致性。

补充说明:传统的 ACID

ACID 是数据库管理系统为了保证事务的一个理论,包括四个要求:

A:原子性,Atomicity

要求在一个事务中的所有操作,要么全部执行完成,要么全部都不完成,不会在中间过程中结束。事务在处理过程中一旦发生错误就会被回滚到初始状态。

C:一致性,Consistency

要求在事务开始前和结束后,数据的完整性不被破坏。

I:隔离性,Isolation

要求在多个并发事务执行时,保证交叉执行不会互相影响,导致数据的不一致。在事务隔离级别上分为:读未提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)、串行化(Serializable)。

D:持久性,Durability

要求在事务结束后,不管什么条件下,哪怕系统崩了,对数据的修改都是持久化的。

04

设计模式

此处我命名为设计模式,但是此设计模式非彼设计模式。这里我所讲的分布式架构设计模式,是指在构建、维护和演进分布式系统时遇到的常见问题的常用场景解决方案。俗称基于经验总结,经过行业实践验证,有助于提高分布式系统的性能、可伸缩性和可靠性。

下面会对常用的模式进行简单的介绍说明以及它所适用的场景:

01

客户端-服务器模式

这是一种现在比较典型的分布式系统架构模式,客户端和服务器通过网络进行通信,客户端发送请求,服务端响应请求并返回结果。

它适用于需求相对明确、资源分工相对明确的业务场景。

02

主从复制模式

在这个模式里面,有一个住节点负责数据写操作,多个从节点从主节点复制数据,负责数据读操作,和 前面讲的常见软件架构中 CQRS 有类似的味道,但这个模式在分布式系统中,往往是指在数据库层面的架构设计方法。

它适用于读操作非常频繁,写操作相对少的业务场景,该场景下通过多个读节点来提高系统的读取性能。

但在该模式下存在单点故障的严重风险,一旦主节点宕机会导致整个系统不可用。

03

分区模式

将系统数据分为多个分区,每个分区独立管理,来提高系统的扩展性和并发现。

它适用与大规模数据和用户的场景,比如我们常见的分布式数据库或者分布式文件系统就是典型的分区模式。

04

分层模式

将系统划分为多个层次,每个层次负责特定的功能,有清晰的职责定义和边界划分,来提高系统的可维护性和可扩展性。比如经典的 MVC 三层架构、COLA 的四层架构。

它适用于复杂系统,通过分层降低系统的耦合度,使得不同层次的组件能够独立变更。

05

微服务模式

微服务模式是一种将应用程序划分为一组小型的并且相互独立的服务,每个服务独立部署独立发布,独立运行在自己的进程中。

它适用于需要高度可扩展性和独立部署的场景,允许使用不同技术栈。

06

一致性哈希模式

它是通过哈希函数将数据分布到多个节点中,使得新增或删除节点时影响最小。

它适用于需要频繁扩展和缩减节点的场景,比如负载均衡。

07

事件驱动模式

事件驱动是通过事件的产生、传递和响应来实现系统之间的松耦合。

它适用于降低系统间依赖性,提高系统弹性的场景。

08

领导者选举模式

该模式确保在分布式系统中只有一个节点充当零担这,其他节点均为从节点。

它适用于需要有序执行的场景,比如分布式锁的实现机制。

09

状态机复制模式

该模式确保在所有节点上执行相同的状态机,保持系统的一致性。

它适用于需要一致性和可靠性的场景,比如分布式数据库。

10

布隆过滤器模式

用于快速检查一个元素是否属于一个集合,用以减轻数据库或存储系统的负担。

它适用于高效判断某个元素是否存在的场景,比如缓存系统。

11

反熵模式

反熵模式通过引入额外的信息熵来提高系统的可用性。

它适用于降低系统熵值,减少系统混乱的场景,比如故障诊断系统。

架构设计系列之分布式系统架构核心要求:分布式数据管理

随着互联网时代的不断发展,分布式系统架构成为之城大规模用户和高并发访问的基础。在构建分布式系统时,分布式系统有着一系列的要求以及对应的核心技术,涉及到数据管理、通信安全性、性能优化、可扩展性设计以及架构演进与版本管理等很多方面。

分布式

数据管理

 NO.1 

构建稳健数据基石

在信息技术迅猛发展的今天,大规模分布式系统在应对海量数据和高并发访问方面表现出了超强的优越性。在分布式系统架构中,数据管理是至关重要的一环。

数据一致性的重要性

随着业务规模和系统规模的不断增加和扩大,分布式系统逐渐成为解决大规模数据处理和高并发访问的首选方案。然后,在分布式系统中,数据一致性问题成为系统设计时的一大难题。

在分布式系统中,多个节点同时访问和修改数据,确保这些数据在不同节点上保持一致性变得至关重要,数据一致性直接关系到系统的正确性和可靠性,尤其是对于金融领域、交易领域、库存领域等业务场景尤为关键。

比如,TaoBao 平台,如果一个用户在 TaoBao App 上完成订单支付后,是需要更新对应商品的库存数量、订单状态、物流信息等。当前在 TaoBao 内部,像库存、订单、物流都是不同的团队在负责,部署在不同地域、不同节点、多个节点上,这时的数据更新操作其实是不能直接保证数据一致性的,可能会导致库存数量和实际数量不 Match、用户买家订单状态不准确、物流系统中物流状态不同步更改等问题,一旦出现会严重影响系统的可靠性,同时丧失口碑,造成用户的流失。

数据一致性的挑战

在分布式系统中,数据一致性的挑战主要包括以下三个方面:

1

节点故障

当系统中的某个节点发生不可快速恢复的故障时,可能会导致该节点上的数据与其他节点不一致。这会要求我们系统能够检测节点故障并采取响应的措施来保障数据的一致性。

2

并发修改

多个节点同时对相同的数据进行修改,可能会导致数据冲突和不一致。系统需要设计合适的并发控制策略,以确保数据的正确性。

3

网络延迟

在分布式系统中,节点之间通过网络通信进行数据同步。由于网络延迟的存在,可能会导致在不同节点之间的数据同步出现延迟,影响到数据的一致性。

分布式事务解决方案

分布式事务的提出是为了解决数据一致性问题。分布式事务十一组事务操作的集合,要么全成功,要么全失败,确保数据在不同节点上都是一致的。

01

2PC

2PC 是一种经典的分布式事务协议,分为两个阶段:

第一个阶段:协调者询问所有参与者是否可以执行事务

第二个阶段:根据投票结果决定是否提交或回滚

尽管 2PC 保证了分布式系统的一致性问题,但是它的这种模式,其同步阻塞的特性会严重影响到性能。

02

补偿事务

补偿事务是一种基于回滚操作的分布式事务协议。当事务发生错误时,系统会执行一系列的补偿操作,将数据恢复到正确的状态。这种方式能够降低同步阻塞的问题,但是需要设计合理有效的补偿方案。

03

最终一致性

最终一致性是一种相对弱的一致性,允许系统在一段时间内出现不一致的状态,但最终会收敛到一致的状态。

它通过异步复制和版本控制来实现,适用于一些对实时性要求不高的场景。

核心技术

随着大数据时代的到来,分布式数据管理已成为企业应对海量数据的关键技术,一般包括:

数据分片

在分布式数据库中,数据分片是指将数据分成多个片段,每个片段被存储在不同的计算机上。数据分片技术可以提高数据的可扩展性和可用性,因为每个片段可以独立地存储在不同的计算上,从而避免了单点故障。

以 Hadoop HDFS 为例,它是分布式文件系统,将数据存储在多个节点上,实现了数据的分布式存储和管理。

在 Hadoop HDFS 中,文件被分成多个块,每个块存储在一个独立的节点上。当客户端需要读取文件时,会从 HDFS 的元数据服务器获取文件块的分布情况,然后从不同的节点上读取这些块。这种方式提高了数据可扩展性和可用性,因为文件块可以独立地存储在不同的节点上,从而避免单点故障。

数据复制

为了提高数据的可用性和容错性,分布式数据库通常会使用数据复制技术。是指将数据从一个节点复制到另一个节点,提供数据的冗余性和可用性。当一个节点发生故障时,另一个节点可以接管该节点的任务,从而保障数据的可用性和可靠性。

以 Cassandra 为例,它是开源的分布式数据库,采用了分布式数据复制技术。

在 Cassandra 中,每个节点都保存了整个数据库的副本,当一个节点发生故障是,Cassandra 会检测到并将其从集群中移除,其他节点将继续正常运行并提供服务,保证数据的可用性和可靠性。Cassandra 还支持动态地添加节点,从而实现数据的水平和垂直扩展。

事务处理

事务处理是分布式数据库中的核心技术质疑,可以保证数据的完整性和一致性,事务处理可以确保一系列的数据操作要么全部成功,要么全部失败,避免数据的不一致性。在分布式数据库中,事务可以跨越多个节点进行操作,因此需要采用分布式事务处理技术,确保数据的 ACID 特性。

以 HBas 为例,HBase 是一种分布式列式存储数据库,它支持多个节点的事务处理。

在 HBase 中,事务可以跨越多个节点进行操作,为了保证事务的原子性和一致性,HBase 采用了 Write-Ahead-Logging(WAL)机制:当事务开始时,HBase 会将所有操作记录到 WAL 中,当事务提交时,HBase 会将这些操作应用到实际的数据中,如果事务失败,HBase 可以根据 WAL 中的记录进行回滚操作,以保证数据的完整性和一致性。

查询处理

在分布式数据库中,查询可以跨越多个节点进行,因此需要采用查询优化技术,选择最有的查询路径,提高查询效率。查询优化技术可以根据查询条件和数据分布情况自动选择最有的查询路径,提高查询效率。

以 ES 为例,ES 是一种基于 Lucene 的分布式搜索和分析引擎,支持高效的查询和查询优化。

在 ES 中,查询可以跨越多个节点进行。为了提高查询效率,ES 采用了分布式查询优化技术:当用户发出查询请求是,ES 会根据查询条件和数据分布情况自动选择最有的查询路径,ES 还会对查询进行分片处理,将大查询拆分成多个小查询,并在各个节点上并行执行,从而提高查询效率。

数据安全与隐私保护

为了实现数据的安全和隐私保护,需要采取一系列的安全措施,包括加解密技术、访问控制和审计等。加解密技术可以保护数据的机密性和完整性,访问控制可以限制用户对数据的访问权限,审计可以记录用户对数据的操作行为,从而确保数据的可靠性。

以 Hive 为例,Hive 是 Hadoop 生态中的一种数据仓库工具,可以用于数据分析和查询,支持数据的安全和隐私保护功能。

在 Hive 中,用户可以设置不同的方位控制策略来限制用户对数据的访问权限。Hive 还支持加密存储数据,以保证数据的机密性。另外 Hive 还提供了审计功能,可以记录用户对数据的操作行为,从而便于监控和管理。

其他技术

除了以上介绍的核心技术以外,分布式数据管理还有一些其他相关的核心技术,比如:

  • 集群管理技术用于管理分布式系统中多个数据节点

  • 监控管理技术用于实时监控性能和状态

  • 备份恢复技术用于保证分布式系统的数据安全和可靠性

以 ZooKeeper 为例,它是一种分布式协调服务,可以用于管理分布式数据库中的多个节点。

在分布式数据库中,节点之间的通信和协调是非常重要的,ZooKeeper 可以提供一个可靠的分布式协调服务,帮助节点之间进行通信和同步,还可以用于管理节点的元数据信息、监控节点的状态和提供其他一些公共服务,从而为分布式数据库的正常运行提供保障。

分布式数据库

随着企业数据来的不断增加,传统的关系型数据库已经无法满足现代应用系统对性能和可扩展性的要求。因此,分布式数据库应运而生,为了企业提供更灵活、高效和可扩展的数据管理方案。

上面介绍了分布式数据库一般具备的核心技术,在这部分我们再来看看常见分布式数据库的介绍、分布式数据库的选型。

常见分布式数据库

Cassandra

是一个高度可扩展、分布式的 NoSQL 数据库系统,旨在处理大规模数据的写入和读取。

采用了分布式架构,通过分布式的数据存储和无中心节点的设计实现了高度的可用性。

适用于需要快速写入和读取、数据规模巨大的场景,比如日志存储、实践序列数据等。

MongoDB

是一个面向文档的分布式数据库。

支持丰富的查询语言和灵活的数据类型,使得开发者能够轻松地存储和查询复杂的数据结构。

适用于需要处理半结构化数据、快速迭代开发的场景。

HBase

是建立在 Hadoop 之上的分布式列式数据库,采用了 Bigtable 的设计理念。

HBase 的强一致性和高可用性成为处理大规模数据存储和查询的理想选择。

适用于需要实时读写大规模数据集的场景,比如实时分析、日志处理等。

TiDB

TiDB 是一个新兴的分布式 NewSQL 数据库,具备传统关系型数据库的 ACID 特性,同时拥有分布式数据库的横向扩展能力。

适用于需要关系型数据库事务支持和水平扩展的场景。

如何选择分布式数据库

在对分布式数据库进行技术选型时,一般考虑以下因素:

  1. 数据模型和查询语言:这是在选型时的首要考虑点,要看数据模型和查询语言是否符合实际的需求,比如文档数据库适用于半结构化数据

  2. 可扩展性:可扩展性是选择的关键考虑点,因为数据库的水平扩展能力决定了是否可以应对未来数据规模的增长

  3. 一致性和可用性:根据实际应用场景对一致性和可用性的要求,来选择合适的分布式数据库

  4. 社区和生态系统:在选型的同时,要考虑数据库的社区支持和生态系统,这对解决问题、获得技术支持以及与其他系统集成有很大帮助

选择合适的分布式数据库和采用合适的数据管理技术,成为分布式系统架构设计中直观重要的一个环节。通过充分了解分布式数据管理的特性、技术、挑战以及分布式数据库,结合实际应用场景的需求,可以为构建稳定、高效的分布式系统奠定基础。

END

在实际应用中,不同的数据库是很大可能需要组合使用的,形成多样化、弹性的数据存储解决方案。在我现在负责数据管理平台中,我就使用了 Polar & MongoDB & HBase & Redis & ES & Doris & ...的组合数据存储管理策略。

架构设计系列之分布式系统架构核心要求:分布式通信机制

分布式

通信机制

 NO.2 

保障系统正常运行基石

在分布式系统中,各个组件之间的通信是保障系统正常运行的基石,直接影响到系统的性能、可扩展性以及整体的可维护性。接下来我们就一起看看通信在分布式系统中的重要性,以及一些常用的技术实现方案。

通信的角色

在分布式系统中,通信扮演着连接各个节点的纽带,保障节点之间能够有效传递信息,关键角色主要包括:

01

节点之间的通信

分布式系统的核心在于多个节点之间的协同工作,节点通信是实现这一目标的基础。

02

跨网络的通信

分布式系统通常部署在不同地理位置的服务器上,因此跨网络通信需要关注效率和安全性。

03

异步通信

通过异步通信,系统能够更好地处理大量请求,提高整体性能和响应速度。

通信的重要性

01

节点协同

分布式系统的核心在于多个节点之间的协同工作,而节点之间的协同离不开高效的通信机制。

02

系统整合

一个分布式系统通常由多个独立的服务组成,它们需要相互通信以完成整体业务流程。

03

性能优化

良好的通信机制可以优化系统性能,提高个节点之间的信息传递效率。

常用通信实现技术方案

为了实现高效的通信,不同的技术和协议被开发出来以满足各种场景和需求。以下关于分布式系统中通信的一些技术实现、优缺点以及常用的技术框架或组件进行一个总结介绍:

同步通信场景

同步通信是一种阻塞式通信方式,发送方在等待接收方的确认之前不会进行其他操作,这种方式确保了数据的可靠性。

优点

  • 数据完整性:每个消息都会得到确认

  • 简单易用:编程模型相对简单

缺点

  • 性能:由于需要等待确认,可能影响系统的整体性能

  • 延迟:如果网络延迟较高,可能会导致请求响应时间增加

常用技术框架/组件

  • RPC(Remote Procedure Call) 框架,现今 RPC 框架可谓是百花齐放,比如 gRPC、Dubbo、Thrift 等,后面我有一个专门讲 RPC 的主题,可以期待一下

异步通信场景

异步通信是非阻塞式的,发送方在发送消息后不需要等待接收方的确认就可以继续执行其他操作,这种模式通常使用消息队列来传递消息。

优点

  • 高性能:允许你系统在不等待回应的情况下处理更多任务

  • 解耦:发送者和接收者之间解耦,提高了系统的灵活性和可扩展性

缺点

  • 复杂性:相比同步通信,异步通信的编程模型更复杂

  • 可靠性:如果不采取额外措施,可能会丢失数据

常用技术框架/组件

  • 消息队列,如 Apache Kafka、RabbitMQ、RocketMQ 等,后面我也有一个专门讲消息队列的主题,继续期待

单播通信场景

单播通信是点对点的通信方式,一个节点向另一个特定的节点发送消息。

优点

  • 易于理解和实现

  • 资源利用效率高,因为只有一条路径进行传输

缺点

  • 如果目标节点不可达,可能导致消息丢失

广播通信场景

广播通信是一种一对多的通信方式,一个节点向所有其他节点发送相同的消息。

优点

  • 在需要通知多个节点时非常有用

缺点

  • 网络带宽消耗大,特别是当网络中有大量节点时

组播通信场景

组播通信介于单播和广播之间,一个节点向一组特定的节点发送消息。

优点

  • 与广播相比,减少了不必要的资源消耗

  • 适用于需要同时通知多个节点但不是全部节点的情况

缺点

  • 实现起来较为复杂,需要网络支持组播功能

常用技术框架/组件

  • 组播库,如 Java 的 MulticastSocket 类

流通信场景

流通信是一种持续的数据交换方式,适合传输大量数据或实时媒体内容。

优点

  • 支持大数据量传输

  • 实时性强,适合音视频等流媒体应用

缺点

  • 对网络稳定性要求较高

常用技术框架/组件

  • RTMP(Real-Time Messaging Protocol)、WebRTC(Web Real-Time Communication)等流媒体传输协议

问题解答

1

为什么单播通信场景和广播通信场景

没有常用的技术框架/组件?

对于单播通信场景和广播通信场景,尽管是网络通信的基本场景,但是在分布式系统中,通常不会直接使用特定的框架/组件来实现这些通信场景,而是通过更高级别的抽象来完成,比如编程语言提供的网络库、操作系统提供的套接字 API、其他中间件等。

在使用 TCP/IP 协议时,无论是单播还是广播通信,都是通过 Socket API 来实现,可以配置目的 IP 地址和端口号来决定是发送到单个目标还是广播到所有接受者。

在有些情况下,一些中间件或技术可能会提供对单播和广播的支持,但他们通常不是专门为了实现这两种通信模式而设计的,比如一些网络库,像BSD Sockets(C/C++)、Java 的 java.net.Socket 类、Python 的 socket 模块等。

2

从上面介绍的通信场景中

为什么没有 WebSocket 呢?

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间建立持久性的连接,以便进行双向通信。WebSocket 协议通过一个握手过程开始,在这个过程中,客户端和服务器交换 HTTP 请求和响应来升级连接到 WebSocket。

从通信模式的角度看,WebSocket 可以被视为一种异步、双向的消息传递机制。然而,由于它是基于单一的长连接,它既不是传统的单播也不是广播,而是提供了一种更高级别的抽象,使得开发人员可以方便地实现各种通信模式。

通过使用 WebSocket,你可以很容易地实现:

  • 单播通信:向特定的目标节点发送消息

  • 广播通信:将消息发送给所有连接到同一 WebSocket 服务器的客户端

  • 组播通信:通过在服务器端进行逻辑处理,实现类似于组播的功能,如向一组具有特定属性或订阅了特定主题的客户端发送消息

因此,WebSocket 不属于上述的任何一种方式,而是一种能够支持多种通信模式的技术。

WebSocket 适用与实时性要求高、频繁通信的场景,比如在线聊天、实时监控等,不过相对于 HTTP,它引入了更多的开销,适用场景相对有限。

3

从上面介绍的通信场景中

为什么没有 HTTP/RESTful 呢?

HTTP/RESTful 不完全属于上述的任何一种通信模式。它是一种应用层协议,通常用于在分布式系统中实现客户端与服务器之间的交互。而上面提到的单播、广播和组播是网络层或传输层的概念,它们描述的是数据在网络中的传输方式。

HTTP/RESTful 更多地关注于如何设计和使用 HTTP 协议来实现资源导向的架构风格(即 REST,Representational State Transfer)。RESTful API 是基于 HTTP 协议,通过使用不同的 HTTP 方法(如 GET、POST、PUT、DELETE 等)来操作资源,从而提供了一种标准的方式来访问和修改远程服务的状态。

从某种程度上讲,HTTP/RESTful 可以视为一种异步通信方式,因为客户端发送请求后不需要等待服务器响应就可以继续执行其他任务。然而,这并不意味着 HTTP/RESTful 就等同于异步通信。实际上,根据具体的应用场景和编程模型,HTTP/RESTful 也可以被用来实现同步通信。

总之,HTTP/RESTful 是一种用于构建分布式系统中客户端-服务器通信的技术,它可以支持多种通信模式,包括但不限于异步通信。

补充知识点

同步 | 异步 | 阻塞 | 非阻塞

在实际编程中,同步、异步、阻塞和非阻塞这是四个非常关键的概念,涉及到程序执行的并发性和数据一致性。专门补充介绍以下相关的概念和要求。

同步(Synchronous)

通常是指在执行一个操作时,调用者需要等待该操作完成才能继续执行后续的代码。例如,在Java中,当你调用一个方法并期望立即得到结果时,这就是同步行为。同步确保了操作的顺序性,并且可以避免竞态条件。

异步(Asynchronous)

意味着调用者不需要等待操作完成就可以继续执行其他任务。在异步编程中,当一个操作开始时,控制权立刻返回给调用者,而实际的操作会在后台线程中进行。异步操作完成后,通常会通过回调函数或 Future 对象通知调用者。

阻塞(Blocking)

是指在执行某个操作时,线程会被挂起,直到满足特定条件或操作完成为止。在Java中,许多I/O操作(如文件读写、网络通信等)默认是阻塞的,这意味着如果资源未准备好,调用线程将会被挂起,直到资源就绪。

非阻塞(Non-Blocking)

指在执行操作时,即使资源尚未准备就绪,也不会导致线程被挂起。相反,非阻塞操作会立即返回一个状态,告诉调用者当前资源的状态(如“已就绪”、“正在进行”或“错误”)。非阻塞操作通常结合轮询或事件通知机制来实现。

在Java NIO(非阻塞I/O)中,提供了非阻塞的I/O通道,可以通过轮询的方式来检查数据是否可用。

同步和异步关注的是调用者与被调用者之间的协作模式,阻塞和非阻塞关注的是线程在执行过程中是否会被暂停。两者之间是可以相互组合,以实现不同的并发编程模式,常见组合说明如下:

同步阻塞(Synchronous Blocking)

这是最常见的编程模型,调用者需要等待操作完成,并且在等待期间线程会被阻塞。

同步非阻塞(Synchronous Non-Blocking)

在这种情况下,调用者仍然需要等待操作完成,但不会阻塞线程。通常通过轮询或事件通知机制来检测操作是否完成。

异步阻塞(Asynchronous Blocking)

这种组合比较少见,因为异步操作的目的通常是避免阻塞。然而,在某些特定场景下,如等待异步操作的结果时,可能会发生阻塞。

异步非阻塞(Asynchronous Non-Blocking)

这是现代高并发系统中最常用的编程模型。调用者不需要等待操作完成,并且在等待期间不会阻塞线程。

理解这些概念及其组合可以帮助你更好地设计并发和分布式系统的代码。在实际应用中,根据性能、资源利用率和响应时间等需求,选择合适的编程模型至关重要。

架构设计系列之分布式系统架构核心要求:安全性设计

在现代的软件研发过程中,分布式系统的安全性和稳定性已经成为至关重要的因素。随着数据量和用户规模的增长,确保系统不受恶意攻击、保护用户隐私以及保证服务的可用性变得越来越重要。

01.  安全威胁

分布式系统面临着各种各样的安全威胁:

安全威胁

拒绝服务攻击(Dos)

通过大量的无效请求使服务器资源耗尽,导致正常用户无法访问。

安全威胁

中间人攻击

攻击者拦截并篡改网络通信,以窃取敏感信息或执行恶意操作。

安全威胁

注入攻击

如 SQL 注入、命令注入等,通过输入恶意代码来控制系统的运行。

安全威胁

跨站脚本攻击(XSS)

通过在网页上注入恶意脚本来劫持用户会话或获取敏感信息。

安全威胁

未经授权访问

未经授权的用户能够访问受保护的资源。

安全威胁

内部威胁

恶意的内部人员或被社会工程学手段欺骗的员工可能导致数据泄露或破坏。

02.  应对策略

为了抵御上述安全威胁,我们在日常系统的架构设计和执行过程中,需要实时一系列的安全策略:

应对策略

防火墙和入侵检测

用于监控网络流量,阻止恶意请求,并警告管理员潜在的攻击。

应对策略

Web 应用防火墙

专门针对 Web 应用的防火墙,可以防止常见的 Web 攻击。

应对策略

安全编码实践

遵循最佳编程实践,避免引入已知的安全漏洞。

应对策略

持续集成和持续部署(CI/CD)

自动化测试和部署过程,确保快速发现和修复安全问题。

应对策略

定期审计和渗透测试

评估系统的安全状况,发现潜在的漏洞,并进行修复。

应对策略

安全意识培训

提高员工对安全问题的认识,减少内部威胁。

03.  具体实施策略

身份验证

身份验证是确保只有授权用户能够访问系统的过程。常见的身份验证方法包括:

  • 用户名/密码:这是最基础的身份验证方式,用户需要提供预设的用户名和密码来登录系统

  • 双因素认证:除了密码之外,还需要用户提供第二种验证信息,如短信验证码或硬件令牌生成的一次性密码

  • OAuth 和 OpenID Connect:这些协议允许用户使用第三方服务进行身份验证,如通过 WeChat 等其他第三方的账户登录

  • 生物特征识别:在 AI 时代,现在更多的开始出现对生物特征的识别,比如指纹识别、人脸识别、声纹识别等

授权

授权是指确定用户可以访问哪些资源以及可以执行哪些操作的过程。常见的授权模型包括:

  • 基于角色的访问控制(RBAC):根据用户的职责或角色分配权限,每个角色有其特定的访问权限

  • 基于属性的访问控制(ABAC):根据用户、环境和对象的属性决定是否允许访问

加密通信

加密通信是保护数据在传输过程中不被窃听和篡改的关键手段。常用的加密技术包括:

  • SSL/TLS:用于保护网络连接的安全,为 HTTP 提供安全层,形成 HTTPS

  • AES:对称密钥加密算法,用于数据存储和传输中的加密

  • RSA:非对称密钥加密算法,常用于密钥交换和数字签名

数据完整与一致性

确保数据在存储和传输过程中的完整性和一致性对于防止数据泄露和错误至关重要。常用的方法包括:

  • 哈希函数:计算数据的唯一指纹,用于检测数据是否被篡改

  • 消息认证码:结合密钥和数据计算一个固定长度的值,以确认数据的完整性和来源

  • 数字签名:使用公钥加密算法对数据进行签名,以证明数据的完整性和发送者的身份

容错和高可用性

为了应对可能的故障和攻击,分布式系统应该具备一定的容错能力和高可用设计:

  • 冗余:在多个节点上复制数据和服务,以便在某个节点发生故障时仍然能够提供服务

  • 自动恢复:当检测到故障时,系统应能够自动切换到备用节点或重新启动服务

  • 负载均衡:将请求分发到多个服务器,避免单点过载和提高整体性能

审计和日志

审计和日志记录是监控系统行为、发现异常并进行事后分析的重要工具。

  • 访问日志:记录所有用户的访问行为,用于监控和审计

  • 系统日志:记录系统运行状态和异常事件,帮助诊断问题

  • 安全审计:定期审查系统的安全设置和实践,以确保符合最佳实践和法规要求

安全更新与补丁更新

及时应用安全更新和补丁是预防已知漏洞被利用的关键步骤。

  • 自动化更新:通过自动化工具定期检查和安装操作系统、应用程序和库的更新

  • 漏洞扫描:定期扫描系统以发现潜在的安全漏洞,并采取相应的措施修复

  • 代码审核:定期审查代码以发现潜在的安全问题,并修复它们

终会相遇的你:

实现分布式系统的安全性设计是一个多方面的工作,涵盖了身份验证、授权、加密通信、数据完整性、容错和高可用性等多个领域。通过遵循最佳实践和技术标准,我们可以构建出更加安全、稳定和可靠的分布式系统。

架构设计系列之分布式系统架构核心要求:性能优化与可扩展性设计

在当今大规模应用和服务的背景下,分布式系统已经成为处理高并发、大数据的标配套件。然后,要想构建高性能、可扩展的分布式系统,对性能优化和可扩展设计的深入理解和掌握对架构师和专业的后端研发人员来说是必备能力要求。本文将和大家一起探讨在分布式系统性能优化和可扩展性设计的关键要点,为实际实践过程中提供实用的技术指导。

性能优化

良好的性能可以保障系统的响应速度和用户满意度。性能优化的目标正是提高系统的响应速度、降低资源消耗,并确保在高负载下依旧能够保持稳定的运行。以下是一些常用的性能优化策略:

代码层面优化

在构建高性能的分布式系统时,代码层面的性能优化是非常重要的一个环节。通过合理的编码和优化,能够显著提高系统的响应速度和吞吐量。可以参考以下策略:

消除不必要的计算

避免进行无用的计算是提高程序执行效率的基本方法之一,可以通过以下方法来实现:

  1. 消除冗余的计算:确保每个值只计算一次,然后存储起来供后续使用

  2. 提前计算:对于可以预测的计算结果,可以在需求之前预先计算并缓存起来

  3. 避免重复数据结构操作:在遍历数据或列表时,尽量避免对数据结构进行修改

减少内存分配和释放

频繁的内存分配和释放会增加系统的开销,为了减少这种情况,可以采取:

  • 重用对象:尽可能地复用已有的对象,而不是创建新的对象

  • 使用局部变量:避免在循环体内创建新对象,除非必要

利用并发和多线程

合理的使用并发和多线程是提高系统性能的有效手段,能够更好地利用多核处理器和提高系统的并发能力。

  1. 并行处理:将任务分解成多个子任务,并行执行,但是这里涉及到多线程池的管理,合理使用线程池,避免创建过多线程导致资源消耗

  2. 异步处理:对于耗时的操作,使用异步编程方式,减少线程等待时间,避免阻塞主线程,提高系统的并发处理能力

数据结构和算法优化

合理选择数据结构和算法对于提高代码执行效率是非常重要的。

  1. 选择合适的数据结构:根据实际需求选择合适的数据结构,减少查询和操作的时间

  2. 关注算法复杂度:分析算法的时间复杂度和空间复杂度,选择效率最高的算法执行处理

缓存层面优化

在实际编码的过程中,合理使用缓存是提高系统性能的有效手段。但是谨记不能为了用缓存而用缓存,要结合实际业务场景来做判断和决策。

常用的缓存策略如下:

  1. 分布式缓存:使用分布式缓存减轻数据库的压力

  2. 本地缓存:在服务侧使用本地缓存,减少重复计算

网络层面优化

网络通信是分布式系统中常见的性能瓶颈,因此在实际执行编码的过程中需要合理减少网络请求。

常用的处置策略如下:

  1. 合并请求:将多个小请求合并成一个大请求,减少网络开销

  2. 批量处理:将多个操作放在一个批次中,一次性发送,减少通信次数

数据库层面优化

数据库是分布式系统中的重要组成部分,其性能直接影响到整个系统的稳定性和响应速度。在数据库使用层面,可以采用以下建议策略进行优化。

数据设计优化

在数据库设计层面,涉及到性能优化部分的策略主要是要根据业务需求和查询模式设计合适的库表结构,避免过度规范化。并且要选择适当的数据类型,减小存储空间和提高查询效率。

查询优化

在查询过程中,我们给对应的表中常用查询字段建立索引,提高查询速度,同时要优化查询语句,避免全表扫描。

事务管理

在涉及分布式事务处理的场景,要对事务进行合理的拆分,将大事务拆分成多个小事务,减少锁竞争。同时要根据业务需求场景选择合适的隔离级别。

缓存机制

要善于使用数据库自身的缓存机制,减轻数据库负担。同时对于频繁查询但不经常变化的结果,考虑使用应用层缓存存储。

分区和分表

在进行库表设计的时候,要结合实际使用场景,根据业务需求将表进行分区,提高查询效率。同时还可以将大表拆分为多个小表,减少单表的数据量。

可扩展性设计

在现代互联网时代,分布式系统可扩展性设计成为应对不断增长的用户量和数据规模的关键因素。本部分会就分布式系统可扩展性设计的各个方面进行一个介绍,涵盖架构、数据、计算和通信等方面的策略和实践。

架构设计

微服务架构

采用微服务架构是提高可扩展性的有效途径,将系统拆分成小而自治的服务,每个服务负责一个特定的业务功能,便于水平扩展和独立部署。

弹性设计

引入弹性设计,系统能够根据负载动态调整资源,包括自动伸缩、故障恢复、限流和降级等机制,确保系统在高负载下依然稳定可用。

数据设计

分库分表

采用分库分表策略,将数据水平划分,降低单一数据库的压力,同时提高查询性能,可以基于用户 ID、地理位置等维度进行分片。

数据副本

通过数据复制和分布式存储,提高数据的可用性和读取速度,采用主从复制、多副本同步等机制,确保数据在多个节点之间保持一致。

计算设计

分布式计算

使用分布式计算框架,如Hadoop、Spark等,实现大规模数据的分布式处理。将计算任务分解成小任务,分配给多个节点同时执行,提高计算效率。

无状态服务

设计无状态服务,每个请求都可以由任何一个节点处理,降低系统复杂度,方便水平扩展。状态信息通过分布式存储进行管理。

通信设计

消息队列

引入消息队列作为异步通信的中间件,解耦系统各个组件之间的依赖关系,提高系统整体的弹性和响应速度。

API 网关

采用 API 网关对外提供统一的接口,负责请求的路由、负载均衡和安全性检查。通过 API 网关进行流量控制,保证系统的可用性。

测试和监控

自动化测试

建立自动化测试体系,包括单元测试、集成测试和性能测试,确保系统在扩展时保持稳定。

监控系统

搭建完善的监控系统,实时追踪系统的性能、资源利用率和错误率。通过监控数据进行预测和优化,保证系统的可扩展性。

使

分布式系统可扩展性设计需要综合考虑架构、数据、计算和通信等多个方面的因素。通过微服务架构、分库分表、弹性设计等策略,结合无状态服务、消息队列和API网关等技术,可以实现系统的高可用性、高性能和高弹性,适应不断增长的用户和数据规模。同时,建立完善的测试和监控体系,保障系统在扩展时的稳定性和可靠性。

架构设计系列之分布式系统架构核心要求:架构演进与版本管理

在分布式系统的生命周期中,架构演进和版本管理是很重要的两个环节。本部分会介绍分布式系统架构演进的原则、策略以及版本管理的最佳实践,以帮助研发团队更好地应对需求变化、技术发展和系统升级。

01

架构演进

演进原则

渐进式演进

采用渐进式演进的原则,避免一次性大规模的变革,在实际操作过程中,通过小步快跑的方式逐步迭代升级,降低风险。

模块化设计

模块化设计有助于降低系统的耦合度,使得每个模块可以独立演进,便于系统整体的升级和优化。

演进策略

技术栈升级

根据新技术的发展,逐步升级系统的底层技术栈,以提升性能、安全性和开发效率。

微服务化

将原有的单体系统架构拆分为独立的微服务,实现更灵活的部署和扩展,同时降低开发和维护的复杂性。

02

版本升级

版本控制系统

图片

分支管理

图片

采用合理的分支管理策略,比如主分支用于稳定版本发布,开发分支用于新功能开发,保证团队协同工作的高效性。当前我们团队选择使用阿里云 CodeUp 对代码进行统一管理,使用分支进行需求研发,研发完成后进行分支发布,发布完成后 merge 到 Master。

图片

语义化版本控制

图片

采用语义化版本号规范,明确版本号的意义,便于开发人员理解和系统用户预期。

持续集成和持续部署

持续集成 CI

通过持续集成,确保团队成员的代码能够快速合并,并进行自动化测试,减少集成时的冲突和错误。

持续部署 CD

实现持续部署,将通过测试的代码自动部署到生产环境,缩短上线周期,提高系统的迭代速度。

在我现在的实际部门研发执行过程中,直接使用阿里云的云效流水线功能,建议大家多用,挺好的一个产品。

实践策略

架构演进实践

  1. 微服务化:通过逐步将原有的单体应用拆分为微服务,实现了团队的敏捷开发和快速部署。

  2. 技术栈升级:利用周边工具,逐步将系统的底层技术栈从传统的关系型数据库切换至分布式存储和计算引擎,提升了系统的性能和稳定性。

版本管理实践

  1. 分支管理:采用 Git/CodeUp 分支管理,主分支用于发布稳定版本,开发分支用于并行开发新功能,保证了团队的高效协作。

  2. 语义化版本控制:引入语义化版本控制规范,规范了版本号的命名和演进规则,减少了版本混乱和不一致。

Tips

分布式系统的架构演进和版本管理是系统长期健康发展的关键,通过渐进式演进、模块化设计、技术栈升级、微服务化等策略,以及版本控制系统、语义化版本控制、持续集成和持续部署等实践,可以使系统更好地适应不断变化的需求,提高团队的开发效率和系统的稳定性。

架构设计系列之分布式系统:实践案例

分布式系统在过去的几十年里经历了长足的发展,从最初的简单分布式架构到今天的微服务、云原生等先进架构,取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践,并展望未来可能的发展方向。

01

微服务化实践

背景

一位朋友创业,经营着一家游戏服务企业。在初期,他们的服务主要包括游戏用户注册管理、订单管理、支付服务等功能。整体公司内部运行着一个庞大的应用,为所有服务提供支持。

随着公司出海战略的执行,运营的游戏逐渐增多,开发人员也从最初的几个人扩展到了三十多人。每个游戏开始提出各种各样的定制需求,导致每次发布都涉及十几个分支,代码冲突、改动的连带影响、前端页面查询变慢等问题层出不穷。

实施

在朋友的请求下,经过两周的时间对他们服务的主要情况进行梳理,提出了微服务化改造的建议。由于服务线上需保持持续运行,整个优化流程必须逐步演进和重构。

在行动上,首先使用领域驱动设计(DDD)的业务分析思想对原应用进行了分析。确定了三个主要组件:用户管理服务、订单管理服务、支付管理服务。其他功能先保留在原应用中不动。除了这三块,还设计了一个统一的网关层,承担流量网关和业务网关的职责。

结果

经过两个月的实践,初步实现了这三个主要核心功能服务的自治。团队内部分拆出了三个维护小团队,提高了系统的可维护性和可扩展性。在这种模式下,不同团队可以独立进行开发、测试和部署各自的服务,显著提升了技术团队的开发和部署效率。

改造前后的架构对比示意图如下:

图片

通过微服务化改造,成功实现了系统的模块化和团队自治,有效解决了原先存在的发布问题和开发效率低下的困扰。这套新架构为朋友公司的持续发展和新服务的迭代提供了更加稳健和灵活的基础。

02

云原生化实践

背景

在朋友的公司,进行微服务拆分的同时,也进行了云原生化的改造升级。早期采用传统的部署方式,使用自购服务器,手动打包和部署上线。随着出海战略的推进,这种方式导致了性能问题、应用打包维护等多方面的困扰,难以满足业务快速扩展的需求。

实施

在进行微服务改造的同时,公司采用了应用容器化技术,并使用容器编排工具进行自动化管理。由于公司拥有充足的财力,他们选择了阿里云的 EDAS 管理平台,将拆分后的新应用全部部署到阿里云,实现了初步的云原生化。

结果

将新服务上云后,基于EDAS平台提供的强大功能,系统的弹性和可伸缩性得到了显著提升。系统能够根据业务负载自动扩展和缩减节点(具体场景是根据不同游戏的用户使用情况),同时减少了运维成本,提高了系统的稳定性。

通过云原生化的改造,公司成功应对了业务扩展所带来的挑战,实现了更高效、更稳定的服务运行。这个案例充分展示了云原生技术在提升系统弹性和降低运维成本方面的优势

架构设计系列之分布式系统架构:未来趋势展望

分布式系统作为当今大规模应用的基础,已经在云计算、大数据、人工智能等领域展现了强大的生命力和潜力。结合了网络资料提供的内容,做了关于分布式系统未来展望的部分,大致分为以下几个方面:

01

异构计算的整合

Vol.1

量子计算

随着量子计算技术的发展,分布式系统面临更大的计算能力挑战,未来的系统需要考虑如何充分利用量子计算的优势,同时解决与传统计算环境的整合问题。

Vol.2

边缘计算

随着物联网的普及,边缘计算成为未来分布式系统的重要组成部分。系统需要更智能地管理分布在边缘设备上的计算和存储资源,以提供低延迟、高可用的服务。

02

无服务器架构普及

虽然在前面的章节,我对 Serverless 架构持保守态度,但是不得不说这已经是一个新的趋势,而且确实有一定场景的便利性存在。它可以让开发者更专注于业务逻辑,无需关注底层基础设施。未来的分布式系统可能更广泛地采用无服务器架构,以实现更高的开发效率和资源利用率。

Vol.1

事件驱动架构

Serverless 在大型企业级应用里面的一个应用场景就是采用事件驱动的方式,未来分布式系统可能更加强调事件驱动的架构设计。这有助于实现系统的解耦和弹性扩展。

Vol.2

资源自动伸缩

未来的 Serverless 分布式系统将更加只能,能够根据实际负载情况自动伸缩资源,提高系统的弹性和稳定性。

03

数据驱动的架构演进

未来分布式系统更加注重数据的价值,以数据驱动的方式进行架构演进。通过只能分析和挖掘大规模数据,系统可以更好地适应业务变化和优化性能。很有幸,我现在的公司就是在数据驱动下不停地驱使我对架构进行演进,而且还是结合着 AI 的技术,并行驱动架构的演进升级。

Vol.1

实时数据处理

实时数据处理将成为未来系统设计的重要方向,以满足实时业务需求。流式计算和复杂事件处理技术将在分布式系统中得到更广泛地应用。

Vol.2

人工智能和自动化

未来分布式系统可能引入更多人工只能和自动化技术,通过智能决策和自愈能力提高系统的自管理和自适应性。

04

安全和隐私的强化

随着分布式系统在各个行业中的应用越来越广泛,安全与隐私问题将变得尤为重要。未来的系统需要更强大的安全机制和隐私保护策略。

Vol.1

加密和隐私计算

加强数据的加密保护,采用隐私计算技术,以确保用户数据在传输和存储过程中的安全性和隐私性。

Vol.2

区块链技术

区块链技术可能在分布式系统中得到更广泛的应用,以实现去中心化的身份验证和数据完整性验证。

未来的分布式系统将在异构计算、无服务器架构、数据驱动的架构演进以及安全和隐私的方面迎来更多的挑战和机遇。架构师需要保持敏锐的洞察力,不断吸收新技术,以应对不断变化的应用需求。

到这里,分布式系统架构设计的综述部分就告一段落了,下一篇我们开始几个专题的内容讲解,期待一下吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

灰度发布及声明式资源管理(yaml文件)

一、三种常见的项目发布方式 1)蓝绿发布 2)灰度发布【常用】 3)滚动发布 应用程序升级,面临最大的问题是新旧业务之间的切换 立项-定稿-需求发布-开发-测试-发布,测试上线后,再完美也会有问题,为…

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于回溯搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

50、实战 - 利用 conv + bn + relu + add 写一个残差结构

上一节介绍了残差结构,还不清楚的同学可以返回上一节继续阅读。 到了这里,一个残差结构需要的算法基本都介绍完了,至少在 Resnet 这种神经网络中的残差结构是这样的。 本节我们做一个实战,基于之前几节中手写的 conv / bn 算法,来搭建一个残差结构。其中,relu 的实现和…

EasyCode代码生成器插件

EasyCode文档:https://gitee.com/makejava/EasyCode/wikis/pages?sort_id725187&doc_id166248 EasyCode 优点 可以生成controller层的代码。可以一次性生成多张表的各层代码。可以自定义模板。 EasyCode使用 在插件市场下载easy code插件 在idea中进行数据…

MySQL中的事务到底是怎么一回事儿

简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的,但并不是所有的引擎都支持事务,如MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的…

【教学类-43-14】 20240103 (4宫格数独:正确版:576套) 不重复的基础模板数量:576套

作品展示::——4宫格 576套不重复模板(48页*12套题) 背景需求: 生成4宫格基础模板768套,观看64页内容时,明显看到有错误 【教学类-43-13】 20240103 (4宫格数独:错误版…

[C#]C# OpenVINO部署yolov8实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 抛弃了前几代模型的 Anchor-Base。 YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来,领域内的研究者们…

Python算法例32 统计数字

1. 问题描述 计算数字k在0~n中出现的次数,k可能是0~9中的一个数字。 2. 问题示例 n12,k1,在[0,1,2,3,4,5,6,7,8,9,10&a…

C++ 实现Windows WIFI管理器

文章目录 前言一、代码二、补充知识三、遇到的问题字符集转换 四、剩余问题总结 前言 出于项目需要,需要用C开发一个wifi界面,实现wifi扫描、wifi连接与断开、wifi密码记住的基础功能。 一、代码 话不多说,直接上代码。 #pragma once #inc…

我在CSDN的2023年

一、引言 在2023年的这一年当中,在CSDN的生活让我得到许多知识与启发,也让我获得一些快乐和成就 二、自己的收获 在这一年当中,我从一个只会看别人写的文章解决问题到,可以自己写文章帮别人解决问题,这种成就感是极大…

好用免费的WAF---如何安装雷池社区版

什么是雷池​ 雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动。 Slogan: 不让黑客越雷池半步。 什么是 WAF​ WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。 …

基于VS2019的C++动态链接库DLL生成与调用

一、理论知识及实践经验 实验注意事项及部分程序编写规范(部分源自ChatGPT-3.5): Ⅰ __declspec(dllexport)和__declspec(dllimport)是用于在C中定义动态链接库(DLL)的关键字。在编写动态链接库时,__declsp…

AIGC年度回顾!2024向量数据库是否还是AI发展方向之一?

引言 2023 年,是 AI 技术大爆发的一年,从年初到年末,全球关心技术发展的人们见证了一次次的 AI 技术升级,也逐步加深着对 AGI 发展的畅想。而伴随着生成式人工智能的飞速发展,向量数据库以其独特的技术优势逐渐崭露头角…

修复移动硬盘显示盘符但打不开问题

问题: 移动硬盘显示盘符,但无法打开。点击属性不显示磁盘使用信息。 分析解决: 这是由于硬盘存在损坏导致的,可以通过系统自带的磁盘检查修复解决,而无需额外工具。 假设损坏的盘符是E,在命令行运行以下命令…

流媒体学习之路(WebRTC)——Pacer与GCC(5)

流媒体学习之路(WebRTC)——Pacer与GCC(5) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全…

数据库-MySQL 启动方式

以管理员身份运行命令行 或者Shell net start //查看所有服务 net start MYSQL80 //启动服务 net stop MYSQL80 //停止服务完整安装MySQL社区版本的 会有这个 启动服务 停止服务 重启服务

C# 进阶语法,Linq入门到详解

什么是Linq LINQ (Language Integrated Query) 即语言集成查询–用来作查询一些操作类库主要负责对象的查询。 1、LINQ to Objects 主要负责对象的查询 2、LINQ to XML 主要负责XML的查询。 3、LINQ to ADO.NET 主要负责数据库的查询。 linq核心就是对数据源的操作 学linq另外…

15、Kubernetes核心技术 - 探针

目录 一、概述 二、探针类型 2.1、就绪探针(Readiness Probe) 2.2、存活探针(Liveness Probe) 三、探针探测方法 3.1、exec 3.2、httpGet 3.3、tcpSocket 四、探针配置项 五、探针使用 5.1、就绪探针(Readin…

Java框架相关高频面试题

一,Spring 1,Spring框架中单例bean是线程安全的吗? 2,什么是AOP?你项目有用过吗? 3,Spring事务的失效场景有哪些? 发生自身调用(类中使用this调用本类的方法&#xff0…

这货能大大增强ChatGpt的战斗力

今天我给你介绍一个能大大增强ChatGpt的战斗力的工具: gapier。 注册gapier ChatGpt推出了GPTs的功能,在创建GPTs的时候有个Actions的选项,是给我们调用第三方接口用的,以前一直不知道这么用。 直到我发现了一个网站&#xff1a…