分布式系统设计指南

news2025/3/1 13:51:06

目录

一、分布式简介

二、分布式系统核心概念

        2.1 CAP 理论

        2.2 BASE 原理

三、分布式系统设计

        3.1 微服务拆分

        3.2 通信模型

        3.3 负载均衡

        3.4 数据一致性

        3.5 容错限流

        3.6 扩展性

        3.7 监控预警

        3.8 自动化运维


一、分布式简介

        分布式系统是由单体应用发展而来的,单体应用是将所有的业务功能维护在一个巨无霸的服务中,业务初期可能还能接受,但随着业务发展,单体应用中要维护的代码越来越多,这就导致了代码膨胀、维护成本高、不能快速迭代回滚、沟通成本高、业务耦合互相影响、部署繁琐等问题的出现。为了解决这些问题开始寻求将单体应用进行拆分,按业务模块将单体应用拆分成更小、更容易管理的若干个小服务。

        从单体应用发展为分布式系统是对技术、组织结构、开发流程等多方面的全面改革。那什么是分布式系统呢?

        分布式系统是一种由多台计算机(节点)通过网络互相连接,协同工作以完成共同任务的计算模型。这些节点共享资源并协作处理任务,从用户角度来看,整个系统表现得仍然像一个单体应用。

二、分布式系统核心概念

        分布式系统设计中,有两个核心概念,分别为 CAP 理论和 BASE 原理,他们指导着分布式系统如何在复杂环境下做出权衡和设计决策。

        2.1 CAP 理论

        CAP 理论指出在分布式系统设计中,有三个基本要求,但在任何系统中最多只能满足其中的两个,这三个基本要求为:

  • 一致性(Consistency):所有节点在同一时间看到的数据是一致的,即数据更新后,所有访问都会返回最新的值。
  • 可用性(Availability):每个请求都能在有限时间内得到响应,无论成功还是失败。
  • 分区容错性(Partition tolerance):即使系统中部分网络不可用,系统仍然能够继续运行。

        在实际应用中,由于网络分区是不可避免的,所以通常需要再一致性和可用性之间做出选择。那什么是网络分区呢?在分布式系统中,多个节点之间的网络原本是连通的,但因为某些故障某些节点直接不能连通了,整个网络就被分割成几个区域,这就叫做网络分区。

                                   

        在实际应用中,一些中心化组件都会在 CAP 中进行取舍,如 ZooKeeper 为了保证数据的一致性结果,保证了 CP。在 Nacos 中服务注册发现保证了 AP,配置中心保证了 CP。

        2.2 BASE 原理

        BASE 原理是对 CAP 理论中一致性和可用性权衡的一种应用哲学,在无法保证强一致性的情况下,应该如何设计系统,BASE 原理由三部分组成:

  • 基本可用(Basically Available):系统出现故障时,允许部分功能不可用,但核心功能仍然能正常工作。
  • 软状态(Soft State):系统可以有一段时间内的中间状态,这个状态可能与最终状态不一致,但在一段时间后会达到一致。
  • 最终一致性(Eventual Consistency):系统保证在没有新更新操作的前提下,所有节点的数据最终会达到一致状态,但不保证实时一致性。

        BASE 原理强调牺牲实时一致性来换取系统的高可用性和可扩展性,适用于那些对实时一致性要求不高,但对可用性和伸缩性有较高要求的场景。

        BASE 原理在实际应用中的案例:

  1. 电商系统中在高并发促销期间,为了保证服务可用性,订单系统会先接受订单请求,稍后在进行库存扣减和检查,这样就可能出现短时数据不一致,但最终数据时一致的。
  2. 在消息中间件中,如Kafka或RabbitMQ,消息生产者发送消息到队列后,可能立即确认消息发送成功,但实际上消息还未被消费者消费处理。这里消息的发送与消费之间存在时间差,体现了软状态,但系统最终会确保消息被正确处理,达到消息的最终一致性。

                  

三、分布式系统设计

        分布式系统设计的最终目标是要实现系统的高可用性、高扩展性、可伸缩性、容错性等,那要如何实现这些目标呢,下面来总结下分布式系统设计的实战经验。

        3.1 微服务拆分

        分布式设计的前提是进行服务拆分,可以根据主链路规划对服务进行拆分,每个服务负责一个明确的边界清晰的业务功能。

        服务拆分后每个服务可以使用异构语言进行开发,可以实现快速迭代和部署,服务拆分后可以有自己的数据库访问,降低服务间的耦合度,由于每个服务只维护单一业务功能,所以系统的复杂度也大大降低,便于维护。

        3.2 通信模型

        服务拆分后最重要的是服务之间如何进行通信,服务间的交互才能实现业务的完整性。服务间通信交换数据,需要选择合适的通信协议(HTTP、gRPC)和数据交换格式(JSON)等。

        采用高效的通信协议可以使服务间实现高性能安全的网络通信,是分布式系统中非常重要的一环。另外可以选择同步通信与异步通信,对应请求-响应、发布订阅或基于事件模型运行。

        3.3 负载均衡

        负载均衡是一个关键组件,目的是为了优化资源使用、提高系统响应速度、保证系统的稳定性和可靠性。负载均衡策略确保请求或任务在多个节点之间公平且高效的分配。

        如果没有负载均衡,那大部分请求可能会集中在少数的节点上,而大部分节点处于闲置状态,这显然是不合理的,还可能会出现单点故障。通过负载均衡,即使某一部分节点出现故障,其他部分仍然能继续正常对外提供服务,能有效缩小故障范围。

        负载均衡技术有很多,软件方面的负载均衡技术有 Nginx、HAProxy、Envoy 等。在微服务中还可以通过注册中心实现负载均衡,如 Nacos、Consul等。

        3.4 数据一致性

        在分布式系统中,数据一致性是一个核心挑战,尤其在面对分布式环境中的数据复制、分布式事务处理等情况。上文提到的 CAP 理论值中,需要在一致性和可用性之间做权衡。数据一致性包括如下内容:

  • 强一致性:这是最高级别的数据一致性模型,要求任何读操作都能读取到最新写入的数据。实现强一致性通常会牺牲一定的可用性或分区容错性,或者增加系统的复杂性和延迟。
  • 最终一致性:这是一种较弱的一致性模型,允许系统中的数据副本在一段时间后达到一致状态,而不是立即一致。最终一致性牺牲了即时一致性,换取了更高的可用性和分区容错性。

        分布式环境下数据一致性可以通过 Raft 协议等来保证,可以确保数据在副本间的一致性。

        3.5 容错限流

        在分布式系统设计中,容错、降级和限流是确保系统稳定性和高可用性的关键策略。关于这方面的介绍请参考文章:微服务韧性工程:利用Sentinel实施有效服务容错与限流降级_sentinel限流容错-CSDN博客

        3.6 扩展性

        扩展性(Scalability)是指系统能够通过增加资源(如计算能力、存储空间、网络带宽等)来线性地提高处理能力和容纳更多的负载,而不影响其性能或功能。良好的扩展性是分布式系统能够应对日益增长的用户需求和数据量的关键。

        在目前云原生流行的背景下,可以使用 Kubernetes 根据系统负载实现自动扩缩容,以应对突发流量的变化。

        目前很多开源组件都具有良好的扩展性,如 MongoDB 的切片集群、TiDB 的 TiKV 可以根据需要横向扩展、Elastissearch 的分片设计、Kafka 中增加 partition 可以处理大数据量的消息等等。

        3.7 监控预警

        监控预警是确保系统稳定运行、及时发现并解决问题的重要环节。有效的监控预警体系能够帮助运维团队快速响应,减少系统故障对业务造成的影响。

        系统在运行过程中需要持续跟踪系统的关键指标,如CPU使用率、内存使用、磁盘I/O、网络流量、服务响应时间等。

        通过实时日志工具收集异常日志,并通过即时通讯工具(企业微信、钉钉等)、邮件等通知相关责任人进行关注并处理。

        需要持续关注系统运行情况,通过压测发现系统性能瓶颈并进行相应的升级,确保系统能应对预想的流量峰值。

        3.8 自动化运维

        建立自动化流水线,从代码提交、测试、构建到部署全程自动化,提高开发效率,缩短交付周期。利用容器编排工具如 Kubernetes,自动化管理容器的生命周期,根据资源需求自动扩缩容。

往期经典推荐:

Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践_sentinel和nacos-CSDN博客

​​​​​​​深入解析MongoDB中的锁机制_max number of operations (maxwaitqueuesize) of 160-CSDN博客

高并发架构设计模板_高并发架构设计文档-CSDN博客​​​​​​​

Raft共识算法领导者选举流程揭秘-CSDN博客

TiDB内核解密:揭秘其底层KV存储引擎如何玩转键值对_tidb 架构-CSDN博客

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

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

相关文章

统计绘图 | 既能统计分析又能可视化绘制的技能

在典型的探索性数据分析工作流程中,数据可视化和统计建模是两个不同的阶段,而我们也希望能够在最终的可视化结果中将相关统计指标呈现出来,如何让将两种有效结合,使得数据探索更加简单快捷呢?今天这篇推文就告诉你如何…

使用 Scapy 库编写 TCP 窗口大小探测攻击脚本

一、介绍 1.1 概述 TCP窗口大小探测攻击是一种信息收集攻击,攻击者通过向目标服务器发送特制的TCP数据包,探测目标服务器的TCP接收窗口大小(TCP Window Size)。了解目标服务器的TCP接收窗口大小,可以帮助攻击者优化后…

Spring Web MVC之过滤器Filter和拦截器HandlerInterceptor的区别和用法

作用时机不一样 Spring 框架有一个很重要的类DispatcherServlet。这个类继承了HttpServlet,HttpServlet实现了Servlet接口。相当于图片中的Servlet。所有和Spring框架相关配置,例如注解、xml配置、其他数据库连接配置、bean配置、拦截器配置等其他配置&…

深度学习研究生的职业前景:未来趋势与机遇

deep learning 深度学习研究生的职业前景:未来趋势与机遇一、深度学习的应用领域1. 计算机视觉2. 自然语言处理(NLP)3. 数据分析4. 游戏开发5. 健康医疗 二、职业机遇与挑战1. 工作机会2. 竞争与挑战3. 薪资前景 三、职业发展策略对于深度学习…

国外创意二维码应用:飞利浦旧物翻新活动,传播可持续性消费的重要性!

你知道去年有超过1000万件礼物被扔进了垃圾场吗? 这些被丢弃的物品中有许多仍在使用,飞利浦希望改变这种浪费现象。 去年的地球日,飞利浦策划了一场名为“Better than New” 的二维码营销活动。他们发布了一个视频,通过这个短视频将所有最终…

钉钉魔点指纹考勤机多少钱一台,指纹门禁考勤一体机价格

钉钉魔点指纹考勤机一台多少钱呢,指纹门禁考勤一体机的价格又是多少 钉钉魔点 X2 智能指纹考勤门禁一体机的参考价格是 359 元。 其具体参数情况如下: 产品类型:属于指纹考勤门禁一体机; 验证方式:为电容指纹&…

4、优化阶段

优化概述 编译程序总框架: 优化:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。 等价:不改变程序的运行结果。 有效:目标代码运行时间短,占用存储空间小。 >目的 产生更高效的代码 >遵循的原则 …

618值得购买的东西有哪些?618四款必囤好物清单分享!

随着618购物狂欢节的脚步日益临近,身为数码领域的资深爱好者,我深感有必要为大家推荐一系列经过精心挑选的数码产品精选。无论是热衷于科技前沿的探索者,还是希望通过智能设备提升生活品质的时尚达人,本文所介绍的每一款数码产品都…

MT2096 数列分段

代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e5 10; int n, m; int a[N]; int ans 1; int main() {cin >> n >> m;for (int i 1; i < n; i)cin >> a[i];int num 0;for (int i 1; i < n; i){if (num a[i…

(1)图像识别yolov5—安装教程

目录 1、安装YOLOv5: 2、下载预训练模型: 3、识别示例图片: 1、安装YOLOv5: 首先,你需要在你的计算机上下载 YOLOv5 的文件包,下载链接:https://github.com/ultralytics/yolov5。下载后对压缩文件进行解压。 通常使用 YOLOv5 识别物体,需要安装必要的 依赖…

DataX(DataX简介、部署、同步数据)

DataX&#xff08;DataX简介、部署、同步数据&#xff09; ☀快乐无限 法力无边 目录 DataX&#xff08;DataX简介、部署、同步数据&#xff09; 1.DataX简介 1&#xff09;数据采集模块&#xff1a; 2&#xff09;数据写入模块&#xff1a; 2.DataX部署 1&#xff09;Da…

《AI企业级知识库》-rasa爆改中文版本-实战!

阿丹&#xff1a; 之前有同学反应分享的东西有点概念化&#xff0c;表示不看着代码无法更深刻能理解。那么今天直接上代码&#xff01;&#xff01;&#xff01; 有两种方式使用自己训练好的nlu 1、rasa与nul分开启动&#xff0c;就是在rasa中的配置中配置好目标对应的nlu的服…

语法04 C++ 标准输入语句

标准输入 使用格式&#xff1a;cin >> 输入的意思就是把一个值放到变量里面去&#xff0c;也就是变量的赋值&#xff0c;这个值是由我们自己输入的。 (注意:输入变量前要先定义&#xff0c;输入完之后要按Enter键。) 输入多个变量&#xff0c;与输出类似&#xff0c;…

全球知名哲学家思想家教育家颜廷利:清明节的教育意义

在21世纪全球公认十大思想家的行列中&#xff0c;颜廷利大师以其独到的见解和深刻的哲学思考而备受推崇。随着清明节的临近&#xff0c;人们纷纷前往先人的墓地进行祭奠&#xff0c;其中烧纸钱是一项重要仪式。然而&#xff0c;亚洲十大顶级杰出人物、当代易学泰斗三大人物颜廷…

Python 围棋游戏【含Python源码 MX_008期】

简介&#xff1a; 围棋&#xff0c;源自中国&#xff0c;是一种两人对弈的策略棋类游戏。它被认为是世界上最复杂的棋类游戏之一&#xff0c;因为它的规则简单&#xff0c;但变化复杂多样。围棋的游戏目标是在棋盘上占领更多的地盘&#xff0c;并用自己的棋子围住对手的棋子&am…

禁用PS/Photoshop等一系列Adobe旗下软件联网外传用户数据操作

方案一&#xff1a; 下载火绒杀毒&#xff0c;在联网请求上禁用Adobe软件的联网请求&#xff0c;甚至还可以额外发现哪些是它要想要偷偷摸摸干的。 方案二&#xff1a; 最后注意&#xff1a; 用盗版软件只是获得了使用权&#xff01;

Mcgs 屏幕Modbus RTU通讯调试

目录 1. 设备窗口1.1 添加设备构件1.2 设备配置1.2.1 通用串口父设备配置1.2.2 设备0--ModbusRTU配置2. 设计用户窗口2.1 关联设备通道与实时数据库2.3 用户窗口3. 通信测试本文想要实现通过Modbus协议与Mcgs屏幕进行通信收发数据。在使用Mcgs屏幕进行Modbus通信时,一般Mcgs屏…

个股期权103call是什么意思?

个股期权103call是什么意思&#xff1f; 在金融市场中&#xff0c;个股期权作为一种金融衍生工具&#xff0c;为投资者提供了多样化的投资策略。其中&#xff0c;“103call”这一术语&#xff0c;特指一种特定的期权交易策略&#xff0c;它涉及到看涨期权与虚值状态。 文章来…

ROS——publisher、subscriber的实现

发布、订阅关系架构 创建发布者代码 通过CMakeList设置代码编译规则 add_executable(velocity_publisher src/velocity_publisher.cpp)target_link_libraries(velocity_publisher ${catkin_LIBRARIES}) Velocity Velocity这个词有多重含义&#xff0c;具体意思根据上下文有所…

eNSP学习——配置高级的访问控制列表

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置Telnet 4、配置高级ACL控制访问 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PDF版_ensp配置命令大全资源-…