运维锅总详解系统设计原则

本文对CAP、BASE、ACID、SOLID 原则、12-Factor 应用方法论等12种系统设计原则进行分析举例,希望对您在进行系统设计、理解系统运行背后遵循的原理有所帮助!

一、CAP、BASE、ACID简介

以下是 ACID、CAP 和 BASE 系统设计原则的详细说明及其应用举例:

ACID 原则

ACID 原则主要用于传统关系型数据库,确保事务的可靠性和一致性。

  • Atomicity(原子性):事务中的所有操作要么全部完成,要么全部不完成。

    • 例子:在银行转账系统中,从账户 A 转账到账户 B 是一个事务。如果扣款操作成功而存款操作失败,整个事务将回滚,确保 A 和 B 的余额不会发生不一致的变化。
  • Consistency(一致性):事务完成后,数据库必须从一个一致性状态转换到另一个一致性状态。

    • 例子:在订单管理系统中,创建订单的同时减少库存。如果库存不足,整个事务将失败,订单不会被创建。
  • Isolation(隔离性):并发事务彼此独立执行,一个事务的中间状态对其他事务不可见。

    • 例子:在在线购物系统中,多个用户同时购买同一商品,每个事务隔离执行,确保每个用户都看到正确的库存数量。
  • Durability(持久性):一旦事务提交,数据将永久保存,即使系统崩溃也不会丢失。

    • 例子:在在线支付系统中,支付成功后,交易记录会永久保存,即使系统在支付后立即崩溃,支付记录也不会丢失。

CAP 定理

CAP 定理描述了分布式系统中一致性、可用性和分区容忍性三者之间的权衡,指出在网络分区的情况下,一个系统只能保证一致性和可用性中的两个。

  • Consistency(一致性):所有节点在同一时间看到相同的数据。

    • 例子:分布式数据库 MongoDB 默认配置下,要求所有读操作都能看到最新的写操作,确保一致性。
  • Availability(可用性):每个请求都能收到非错误响应,但不保证数据一致。

    • 例子:DNS 系统,即使某些服务器不可用,用户仍能获取域名解析结果。
  • Partition Tolerance(分区容忍性):系统在网络分区的情况下仍能继续运行。

    • 例子:Cassandra 数据库通过分布式架构和副本机制确保在网络分区时仍能读写数据。

BASE 原则

BASE 是一种设计原则,用于处理大规模分布式系统中的数据一致性问题,相对于 ACID 强调最终一致性和高可用性。

  • Basically Available(基本可用):系统在大部分时间是可用的,但可能存在部分数据不可用或响应时间延迟的情况。

    • 例子:在电商大促销活动期间,购物车服务可能会延迟但仍能正常使用,确保用户基本可用的体验。
  • Soft state(软状态):系统状态允许存在暂时的不一致,经过一定时间后会达到最终一致。

    • 例子:社交媒体平台的用户点赞数据在不同服务器之间可能有延迟,但最终会同步一致。
  • Eventual consistency(最终一致性):系统保证在没有新的更新操作后,经过一段时间,所有数据副本最终会达到一致。

    • 例子:Amazon DynamoDB 在分布式环境中,写操作会传播到所有副本,最终确保所有节点的数据一致。

这些原则和应用举例展示了不同系统设计原则在实际应用中的具体实现方式,帮助理解如何在不同场景中应用这些原则来构建可靠的分布式系统。

二、BASE、CAP 、ACID之间的异同

BASE、CAP 和 ACID 是分布式系统和数据库设计中的三个重要概念,每个概念都涉及数据一致性、可用性和系统性能的权衡。理解它们之间的异同对于设计和选择合适的系统架构非常重要。

ACID

ACID 是传统关系数据库管理系统(RDBMS)中事务处理的四个关键属性:

  • Atomicity(原子性):事务是不可分割的操作单元,要么全部执行,要么全部不执行。
  • Consistency(一致性):事务执行前后,数据库都处于一致的状态。
  • Isolation(隔离性):并发事务的执行不互相影响,每个事务的中间状态对其他事务是不可见的。
  • Durability(持久性):事务一旦提交,其结果就会永久保存在数据库中,即使系统发生故障。

CAP 定理

CAP 定理是 Eric Brewer 提出的关于分布式系统的一个重要理论,指出分布式系统在网络分区情况下,不能同时保证以下三个特性:

  • Consistency(一致性):每次读取都能返回最近写入的结果。
  • Availability(可用性):每次请求都能在合理时间内返回响应。
  • Partition Tolerance(分区容忍性):系统在出现网络分区的情况下仍能继续运行。

CAP 定理强调了分布式系统设计中一致性、可用性和分区容错性之间的权衡。在实际系统中,只能同时满足其中的两个特性。

BASE

BASE 是一种设计原则,用于设计分布式系统,以牺牲强一致性来获得更高的可用性和性能。BASE 的主要属性包括:

  • Basically Available(基本可用):系统保证基本的可用性,允许在部分故障的情况下仍能提供服务。
  • Soft state(软状态):系统的状态可以在不一致的情况下存在一段时间,允许暂时的状态不一致。
  • Eventual consistency(最终一致性):系统在没有新的更新操作后,最终会达到一致状态。

三者的异同

异同点总结
  1. 一致性要求

    • ACID:强一致性,确保每次读操作都能返回最新的写操作结果。
    • CAP:强调在一致性、可用性和分区容忍性之间做权衡,不能同时满足三者。
    • BASE:允许暂时的不一致,最终达到一致性,以提高系统的可用性和性能。
  2. 可用性

    • ACID:优先保证数据的一致性,可能会影响可用性。
    • CAP:系统设计时需要在可用性和一致性之间做出选择,不能同时完全保证两者。
    • BASE:优先保证系统的可用性,允许在短时间内数据不一致。
  3. 系统模型

    • ACID:适用于传统关系数据库系统,事务处理严格,适用于对数据一致性要求高的场景。
    • CAP:适用于分布式系统,帮助理解系统在一致性、可用性和分区容忍性之间的权衡。
    • BASE:适用于分布式数据库系统,注重系统的可用性和性能,适用于对一致性要求较低但需要高可用性的场景。
详细对比
  1. ACID vs. BASE

    • 一致性:ACID 强调强一致性,BASE 强调最终一致性。
    • 可用性:ACID 可能会牺牲部分可用性以保证一致性,BASE 保证高可用性。
    • 适用场景:ACID 适用于金融系统等对一致性要求高的场景,BASE 适用于社交网络、电子商务等对可用性和性能要求高的场景。
  2. CAP vs. ACID

    • 一致性:ACID 只关注强一致性,CAP 需要在一致性和可用性之间做出权衡。
    • 系统设计:ACID 强调单节点事务的一致性,CAP 强调分布式系统的一致性、可用性和分区容忍性之间的平衡。
    • 适用场景:ACID 适用于集中式数据库系统,CAP 适用于分布式系统。
  3. CAP vs. BASE

    • 一致性和可用性:CAP 定理指出分布式系统在网络分区下不能同时满足一致性和可用性,BASE 选择在保证可用性的同时允许最终一致性。
    • 系统容忍性:CAP 强调分区容忍性,BASE 通过软状态和最终一致性来实现系统的分区容忍性。
    • 适用场景:CAP 定理适用于所有分布式系统的设计原则,BASE 主要适用于需要高可用性和可扩展性的分布式数据库系统。

总结来说,ACID、CAP 和 BASE 是在不同背景和需求下提出的系统设计原则。ACID 强调数据的一致性和事务的可靠性,CAP 强调分布式系统中的权衡和限制,而 BASE 则在分布式系统中牺牲一致性以换取更高的可用性和性能。理解这些原则有助于在设计和选择分布式系统时做出合适的决策。

三、其他重要的设计原则和模式

在系统设计中,除了 ACID、CAP 和 BASE 之外,还有许多其他重要的原则和模式,它们各自针对不同的背景和需求。这些原则和模式帮助设计者构建可靠、可扩展、高效和维护性强的系统。以下是一些关键的系统设计原则和模式:

1. SOLID 原则

SOLID 是面向对象设计的五个原则,旨在提高代码的灵活性和可维护性。

  • Single Responsibility Principle(单一职责原则):每个类应该只有一个引起变化的原因。

    • 例子:在一个图书馆管理系统中,将图书借阅处理逻辑与用户管理逻辑分开,使每个类专注于一个职责。
  • Open/Closed Principle(开闭原则):软件实体应当对扩展开放,对修改关闭。

    • 例子:在电商系统中,通过插件机制添加新支付方式,而不修改原有支付处理代码。
  • Liskov Substitution Principle(里氏替换原则):子类对象可以替换父类对象而不影响程序的正确性。

    • 例子:在一个绘图程序中,圆形类和椭圆形类都继承自图形类,它们可以替换图形类的实例而不会影响绘图逻辑。
  • Interface Segregation Principle(接口隔离原则):客户端不应依赖它们不使用的接口。

    • 例子:为打印机和扫描仪创建不同的接口,而不是一个包含所有功能的大接口。
  • Dependency Inversion Principle(依赖倒置原则):高层模块不应依赖低层模块,两者都应依赖于抽象。

    • 例子:在一个电商系统中,高层的订单处理逻辑依赖于一个订单接口,而不是具体的订单实现类。

2. 12-Factor 应用方法论

12-Factor 方法论是构建云原生应用的最佳实践,强调应用的可移植性和可扩展性。

  • 代码库:一个代码库管理多环境部署。

    • 例子:使用 Git 来管理应用代码,并使用不同的分支来处理开发、测试和生产环境的部署。
  • 依赖:显式声明和隔离依赖。

    • 例子:使用 package.json 文件来管理 Node.js 应用的所有依赖,确保应用可以在不同环境中正确运行。
  • 配置:在环境中存储配置。

    • 例子:通过环境变量配置数据库连接信息,而不是硬编码在应用代码中。
  • 后端服务:将后端服务作为附加资源。

    • 例子:将数据库、消息队列和缓存等后端服务作为独立资源来访问,而不是内置在应用中。
  • 构建、发布、运行:严格分离构建和运行阶段。

    • 例子:使用 CI/CD 管道来自动化构建和部署过程,从而保持构建和运行环境的一致性。
  • 进程:应用程序是一组无状态进程。

    • 例子:设计微服务应用时,每个服务都是无状态的,可以在不同的服务器上运行。
  • 端口绑定:通过端口绑定提供服务。

    • 例子:一个 Web 应用在 Docker 容器中运行,绑定到容器的端口上以提供 HTTP 服务。
  • 并发:通过进程模型实现扩展。

    • 例子:使用多线程或多进程模型来处理高并发请求,提高系统的处理能力。
  • 易处理性:快速启动和优雅终止。

    • 例子:应用程序能够快速启动并正确处理终止信号,以保证数据的安全性和完整性。
  • 开发/生产环境等价性:尽可能在开发、测试和生产中保持环境一致。

    • 例子:使用 Docker 容器来确保开发和生产环境的一致性,从而减少环境差异带来的问题。
  • 日志:将日志作为事件流。

    • 例子:应用程序将日志信息输出到标准输出,并使用集中式日志管理工具(如 ELK Stack)进行收集和分析。
  • 管理任务:管理任务的一次性进程。

    • 例子:使用独立的命令行工具进行数据库迁移,而不是将其嵌入到应用程序的运行逻辑中。

3. CQRS(Command Query Responsibility Segregation)

CQRS 是一种将读操作和写操作分离的设计模式,以提高系统性能和扩展性。

  • 读写分离:将读取和写入操作分离到不同的模型中。

    • 例子:在一个在线商店中,使用一个模型处理订单的创建和更新,另一个模型处理订单的查询,从而优化读写操作。
  • 命令模型:处理写操作,确保数据一致性。

    • 例子:订单创建时,使用命令模型进行订单处理,并更新库存状态。
  • 查询模型:处理读操作,优化查询性能。

    • 例子:订单查询时,使用专门的查询模型来提高检索速度,并优化查询性能。

4. 事件溯源(Event Sourcing)

事件溯源是一种将状态变化记录为事件的模式,通过重放事件来重建系统的状态。

  • 事件存储:将状态变化记录为事件,并存储这些事件。

    • 例子:在一个股票交易系统中,每笔交易都记录为一个事件,通过重放所有事件来重建交易历史。
  • 状态重建:通过重放事件来重建系统的当前状态。

    • 例子:通过重放所有账户交易事件来计算当前账户余额。
  • 审计跟踪:提供详细的审计跟踪,记录所有状态变化。

    • 例子:记录所有用户登录和操作事件,以便于事后审计和跟踪。

5. 微服务架构

微服务架构将应用程序拆分为一组小的、自治的服务,每个服务可以独立部署和扩展。

  • 服务拆分:将应用程序功能拆分成独立的服务。

    • 例子:在一个电商平台中,拆分出用户服务、订单服务、支付服务等,每个服务负责特定的业务功能。
  • 独立部署:每个服务可以独立部署和升级。

    • 例子:独立部署支付服务和订单服务,升级支付服务时不会影响订单服务的运行。
  • 技术异构:不同服务可以使用不同的技术栈。

    • 例子:用户服务使用 Node.js 实现,订单服务使用 Java 实现,两者通过 API 进行通信。
  • 松耦合:服务之间通过轻量级通信协议进行交互。

    • 例子:使用 HTTP REST API 或消息队列(如 Kafka)来实现服务间的通信。

6. 服务网格(Service Mesh)

服务网格是一种用于处理微服务架构中服务间通信的基础设施层。

  • 流量管理:控制服务间的流量和路由。

    • 例子:使用 Istio 来管理服务间的流量路由和负载均衡。
  • 服务发现:自动检测和发现新服务实例。

    • 例子:服务网格自动发现新部署的服务实例,并将流量路由到这些实例。
  • 安全性:提供服务间通信的安全性,如加密和认证。

    • 例子:使用服务网格提供服务间的 TLS 加密和双向认证。
  • 可观察性:提供服务间通信的可见性和监控。

    • 例子:使用服务网格收集服务间的通信数据,并进行监控和分析。

7. API 设计原则

设计良好的 API 应该是易于使用、清晰一致、版本控制和文档完备。

  • RESTful API:基于资源的架构风格,使用标准 HTTP 方法(GET、POST、PUT、DELETE)操作资源。

    • 例子:一个图书馆系统的 API 提供获取图书信息的 GET 请求、添加图书的 POST 请求等。
  • GraphQL:一种用于 API 的查询语言,允许客户端指定所需数据结构。

    • 例子:在社交媒体平台中,客户端可以通过 GraphQL 查询获取用户信息和用户帖子,同时只返回需要的数据。

8. 事件驱动架构(Event-Driven Architecture, EDA)

事件驱动架构通过事件来触发和通信系统的不同部分,提高系统的松耦合性和扩展性。

  • 事件发布和订阅:系统中的组件通过发布和订阅事件来进行通信。

    • 例子:在一个电商平台中,订单创建事件可以触发库存更新、邮件通知等多个事件处理过程。
  • 异步处理:使用消息

9. 设计模式

设计模式是面向对象软件设计中的可复用解决方案,包括以下三类:

  • 创建型模式:如单例模式、工厂模式、建造者模式等,旨在创建对象时提供灵活性和复用性。
  • 结构型模式:如适配器模式、装饰器模式、代理模式等,旨在处理类和对象的组合关系。
  • 行为型模式:如观察者模式、策略模式、命令模式等,旨在类和对象间的职责划分和行为协作。

完。
在这里插入图片描述
希望对您有所帮助!关注锅总,及时获得更多花里胡哨的运维实用操作!

四、一个秘密

图片

锅总个人博客

https://gentlewok.blog.csdn.net/

锅总微信公众号

图片

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

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

相关文章

降Compose十八掌之『飞龙在天』| Layout

公众号「稀有猿诉」 原文链接 降Compose十八掌之『飞龙在天』| Layout 页面布局是GUI应用开发的核心,决定着一个UI具体如何实现。今天将延着路线图来练习『降Compose十八掌』的第二招式,学习一下如何使用Compose中的布局来构建页面。 基础骨架 基…

前端vue打印后端对象为[object,object]

今天给自己项目进行编写前端页面时,惊讶的发现,自己进行打印后端传递的对象,一直显示未[object,object],如下图所示: 感觉很奇怪,于是我猜测是不是自己获取的返回数据的问题,在进行添加了datat…

Windows10/11家庭版开启Hyper-V虚拟机功能详解

Hyper-V是微软的一款虚拟机软件,可以使我们在一台Windows PC上,在虚拟环境下同时运行多个互相之间完全隔离的操作系统,这就实现了在Windows环境下运行Linux以及其他OS的可能性。和第三方虚拟机软件,如VMware等相比,Hyp…

云计算【第一阶段(28)】DNS域名解析服务

一、DNS解析的定义与作用 1.1、DNS解析的定义 DNS解析(Domain Name System Resolution)是互联网服务中的一个核心环节,它负责将用户容易记住的域名转换成网络设备能够识别和使用的IP地址。一般来讲域名比 IP 地址更加的有含义、也更容易记住…

202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义

202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义 《我有个拥抱,你要不要》作者一天到晚气fufu,挺有愛的小漫画,适合用来看图说话锻炼小语言,我看的很快乐也写得很痛快&#xf…

打卡第6天----哈希表

每天进步一点点,滴水石穿,日积月累,不断提升。 数组和链表章节告一段落。开启哈希表相关的。 哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里 一、有效的字母异位词 leetcode题目编号:242 题目描述: 给定两个字符串 s 和 t ,编写一个函数…

国内教育科技公司自研大语言模型

好未来的数学大模型九章大模型(MathGPT) 2023年8月下旬,在好未来20周年直播活动中,好未来公司CTO田密宣布好未来自研的数学领域千亿级大模型MathGPT正式上线并开启公测。根据九章大模型的官网介绍,九章大模型&#xff…

语言模型的进化:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中,自然语言处理(NLP)一直是一个充满挑战和机遇的领域。随着技术的发展,我们见证了从传统规则到统计机器学习,再到深度学习和预训练模型的演进。如今,我们站在了大型语言模型&#xff…

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件,如果这些基础模块每个项目都实现一套,维护起来那真的头大,你说呢😉 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子: myLib ├…

你真的会信息收集嘛,4k字渗透测试信息收集10大技巧

前言 在渗透测试中,信息收集是非常关键的一步,它为后续的漏洞发现和利用提供了重要的基础。以下是非常详细的信息收集方式: 一、被动信息收集 被动信息收集是指在不与目标系统直接交互的情况下,通过公开渠道获取目标系统的相关…

LabVIEW在半导体自动化测试中的应用

半导体制造的复杂性和精密度要求极高,每一个生产步骤都需要严格的控制和监测。自动化测试设备在半导体制造中起到了关键作用,通过精密测量和数据分析,确保产品质量和生产效率。本文介绍如何使用LabVIEW结合研华硬件,开发一个用于半…

Nacos注册中心相关错误记录

文章目录 1,com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:jar:unknown was not found1.1 定位及解决方案1.2,简要说明dependencyManagement的作用 2,nacos启动失败2.1 解决方案 1,com.alibaba.cloud:spring-c…

白嫖A100活动来啦,书生·浦语大模型全链路开源体系

扫码参加即可获得: 第一节 书生浦语大模型全链路开源体系 书生浦语大模型的开源历程。 从模型到应用的典型流程 书生浦语的开源体系,包含从数据、预训练、微调、部署、评测、应用等环节

无线领夹麦克风品牌排名,揭秘国产领夹麦克风哪个品牌好

在自媒体行业迅猛发展的浪潮中,领夹麦克风作为音频采集的关键设备,其市场需求正经历着前所未有的激增。面对市场上众多品牌和型号的选择,如何做出既符合个人需求又不失专业水准的决策,成为了消费者亟待解决的问题。 我特意为大家…

逻辑回归中的损失函数

一、损失函数介绍: 与回归问题成本函数不同的是,逻辑回归模型(解决分类问题)的成本函数在获得损失J的时候不再用真实值y与预测值y^的差值计算损失,真实值y不再出现在公式中作为计算项。 首先,该次训练损失…

Gradle基础:从入门到掌握

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 在现代软件开发中,自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…

中国各省金融监管水平-测算数据(2006-2022年)

金融监管水平是指政府及其指定机构通过法律法规对金融机构及其市场行为进行监督、管理与规范的能力和效率,以维护金融体系稳定、保护投资者和消费者权益、促进公平竞争及支持经济增长。衡量金融监管水平的指标多样,常见的一种计算方式是金融监管支出与金…

linux指令练习

二、touch、vi练习: 1、在root家目录下创建目录A1和B1 2、进入B1下同时创建三个文件m1, m2 , n1,单独创建目录N1 3、进入到A1目录中分别创建一个文件t1,k2,同时创建目录F1,F2 4、删除B1下的所有1结尾的文件或者目录 5、删除A1目录…

容易涨粉的视频素材在哪找啊?爆款涨粉的视频素材网站有这几个

亲爱的读者,大家好!今天我们要探讨一个至关重要的问题:在充满竞争的视觉时代,如何使自己的短视频脱颖而出并吸引更多粉丝?关键在于使用那些既酷炫又高质量的视频素材!下面就向大家推荐几个顶级视频素材网站…

【分布式系统】Filebeat+Kafka+ELK 的服务部署

目录 一.实验准备 二.配置部署 Filebeat 三.配置Logstash 四.验证 一.实验准备 结合之前的博客中的实验 主机名ip地址主要软件es01192.168.80.101ElasticSearches02192.168.80.102ElasticSearches03192.168.80.103ElasticSearch、Kibananginx01192.168.80.104nginx、Logs…