分布式系统设计指南

目录

一、分布式简介

二、分布式系统核心概念

        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.mfbz.cn/a/701648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面试八股之super()和this()的区别

super()和this()的区别 super() 目的:super()用于从子类的构造方法中调用父类(超类)的构造方法。这是为了确保父类的初始化操作得以执行,因为子类继承了父类的属性和方法,可能需要先设置好父类的状态。 位置&#x…

【基于detectron2训练数据集】

基于detectron2训练自己的数据集 1. 首先下载官方提供的baloon数据集2. 转换成detectron2的格式3. 训练4. 测试与评价 1. 首先下载官方提供的baloon数据集 import wget from zipfile import ZipFiledef progress_bar(current, total, width80):progress current / totalbar …

rockchip ARM TrustZone

系统架构 分为安全世界和非安全世界。Loader、Trust 运行在安全世界;U-Boot、kernel、Android 运行在非安全世界里(安全的 driver、APP 除外)。 “hypervisor”常见释义为“管理程序”“虚拟机监控器”“超级监督者”。 它是一种可以创建、…

C#发送邮件

C#发送邮件代码,亲测可用。 using System; using System.Net; using System.Net.Mail;namespace MailSend {class Program{static void Main(string[] args){try{MailAddress receiver new MailAddress("666666666qq.com");//666666666qq.com 换成收件人…

天花板复合材料热释放率检测 ISO 5660-1燃烧试验

ISO 5660-1标准简介 ISO 5660-1是国际标准化组织(ISO)制定的一项关于燃烧试验的标准,专门用于测量材料在火灾条件下的热释放率、烟雾产生量和质量损失率。该标准的第1部分主要关注热释放率的测量和评估,是对材料在火灾条件下反应的…

桌面记事软件除了记事本还有什么

在忙碌的工作日,我的桌面总是堆满了各种文件、资料,还有贴满便签的记事本。每次需要查找某个信息或者确认接下来的计划时,我都要在杂乱的桌面上翻找好一会儿,这让我感到非常烦恼。 有一天,我急着找一个之前记录的重要…

地理信息科学中的大数据挑战

在信息化爆炸的时代,地理信息科学(GIScience)正经历着前所未有的变革,其中,地理空间大数据的涌现为科学研究与应用带来了前所未有的机遇与挑战。作为地理信息与遥感领域的探索者,本文旨在深入剖析地理空间大…

java面试整合全套

什么是Java (定义 优点) java是一个平台,由jvm和Java应用编程接口构成的一门面向编程语言。 不仅吸收了C语言的各种优点,还摒弃了c语言里面的多继承,指针等概念,因此java的特征主要有功能强大和简单易用的特征。 jav…

HarmonyOS(33) @LocalStorageProp使用指南

LocalStorageProp使用指南 说明使用示例参考资料 说明 不同于LocalStorageLink与LocalStorage建立的双向同步关系,LocalStorageProp装饰的变量与LocalStorage中给定属性建立单向同步关系。LocalStorageProp(key)是和LocalStorage中key对应的属性建立单向数据同步&a…

深入浅出通信原理 | 通信系统中的性能指标评估

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、通信系统中的性能指…

uniapp学习(001 前期介绍)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第1p-第p10的内容 简介 目录结构 效果 打包成小程序 配置开发者工具 打开安全按钮 使用uniapp的内置组件…

linux-计划任务

作用:定时自动完成特定的工作 计划任务的分类 一次性的计划任务:例如下周三对文档的重要文件备份一次 周期性的计划任务:每天12:00创建一个文件 命令 一次性的任务计划 at batch 周期性计划任务 crontab anacron 一次性计划任务 …

JVM (四)GC过程

一。概述 程序计数器、虚拟机栈、本地方法栈都是随线程生灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,内存垃圾回收主要集中于Java堆和方法区中。 GC整体流程示意图: ① 年轻代对象的移动…

HyperAI超神经 x MoonBit | 与中科院、Intel 等专家共话基础软件前沿发展与期待

本次 Meetup 将讨论 MoonBit 编程语言、RuyiSDK、WAMR和 RISC-V 等技术,来现场参与不仅可以学习到最前沿的技术知识,更可与大咖面对面互动交流心得,还有美食茶歇与精美礼品,期待你的到来! 扫码立即报名 ⬇️ 活动详情…

泛微证券行业数据中心方案:打造多样化的数据收集、汇总、分析、决策一体化报表

证券企业在日常办公、业务开展时,涉及了诸多数据需求,而且数据来源于多部门、多个系统。需要对数据获取、汇总、展现进行高效、可视化的操作,高效利用数据价值,助力企业运营更高效、风险更可控。 泛微基于证券行业数字经营分析的需…

数据中台:生产制造产业链的“智慧大脑”!

在当今激烈竞争的生产制造领域,数据中台正扮演着至关重要的角色,它就像是产业链的“智慧大脑”,引领着产业的发展方向!数据中台在生产制造产业链、生态链中起到以下关键作用: 1. 数据整合与共享:将产业链各…

中国大模型站起来了!甚至被美国团队反向抄袭

一直以来,美国是公认的AI领域强者,我国AI技术虽然差不多,但始终落人一步。然而,近日斯坦福团队的AI模型却被指控抄袭中国AI模型,这下许多人都坐不住了。 被实锤抄袭的,是斯坦福大学AI团队,他们…

UE 像素流与 Web 协同开发

UE 像素流与 Web 协同开发 创建Web端应用Web向UE发送消息emitCommandemitConsoleCommandemitUIInteraction UE接收Web的消息UE向Web发送消息Web接收UE的消息UE 冻结帧 与Web交互主要涉及两个方面,一个是UE向Web发送消息,另一个就是Web端向UE程序发送消息…

功率 MOSFET、其电气特性定义

本应用笔记介绍了功率 MOSFET、其电气特性定义和使用说明。介绍了功率MOSFET的破坏机制和对策及其应用和电机驱动应用。 电气特性定义及使用说明 功率 MOSFET 额定值 导通电阻R_DS(on)与耐压V_DSS的关系 图2表示耐压VDSS20~100V额定元件与导通电阻R_DS(on)之间的…

如何理解质量

早年写过一篇未发表的论文《质量的相对性》,就是为了寻求到底什么才是质量这个问题的答案。现在,在准备了诸多超越以往的认知的概念之后,关于质量是什么的想法,也逐渐有了眉目。 质量有两种,一种叫做惯性质量&#xff…