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

news2024/9/22 5:41:33

本文对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/

锅总微信公众号

图片

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

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

相关文章

【小鸡案例】表单focus和blur事件用法

input中有2个属性,一个是focus获取焦点,一个是blur失去焦点。获取焦点就是我们点击输入框时输入框被选中;失去焦点即点击输入框以外的区域,今天就用这两种属性做一个点击输入框的动画效果。 先写个输入框,代码如下&am…

如何使用 pytorch 创建一个神经网络

我已发布在:如何使用 pytorch 创建一个神经网络 SapientialM.Github.io 构建神经网络 1 导入所需包 import os import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets, transforms2 检查GPU是否可用 dev…

Nacos 进阶篇---集群:选举心跳健康检查劳动者(九)

一、引言 本章将是我们第二阶段,开始学习集群模式下,Nacos 是怎么去操作的 ? 本章重点: 在Nacos服务端当中,会去开启健康心跳检查定时任务。如果是在Nacos集群下,大家思考一下,有没有必要所有的…

[FreeRTOS 基础知识] 任务通知 概念

文章目录 任务通知 定义FreeRTOS 任务通知机制 任务通知 定义 实时操作系统(RTOS)的任务通知机制是一种用于任务间通信和同步的机制。在FreeRTOS中,任务通知允许一个任务向另一个任务发送通知,表明某个事件已经发生或者某些条件已…

鸿蒙语言基础类库:【@ohos.url (URL字符串解析)】

URL字符串解析 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…

【9-2:RPC设计】

RPC 1. 基础1.1 定义&特点1.2 具体实现框架1.3 应用场景2. RPC的关键技术点&一次调用rpc流程2.1 RPC流程流程两个网络模块如何连接的呢?其它特性RPC优势2.2 序列化技术序列化方式PRC如何选择序列化框架考虑因素2.3 应用层的通信协议-http什么是IO操作系统的IO模型有哪…

【Excel技巧大揭秘】如何轻松绕过Excel工作表保护密码?

在日常工作中,我们时常会遇到设置了工作表保护的Excel文件,本意是为了数据安全,但偶尔在急需编辑文件时却遗忘了密码,这无疑让人感到头疼。面对这样的困境,别担心,本文将为您揭秘两种高效解决策略&#xff…

go语言day12 包 init() time包 file包

包 包中的 结构体 及结构体属性 方法 都可以通过设置首字母大小写来实现权限访问,首字母大写任何包中都可以访问,首字母小写只在同包中可以访问。 再导入包go文件时,可以给.go文件取别名。 在导入的包名前加入 _ 意思是调用该包的初始…

OpenHarmony 入门——单元测试UnitTest快速入门

引言 OpenHarmony 的单元测试(UnitTest)是一个关键的软件开发过程,它确保代码的各个部分能够按预期工作,OpenHarmony的测试框架中提供了很多种的单元测试,今天简单介绍下UnitTest 类型的TDD测试。 OpenHarmony 的TDD …

尚品汇-(十五)

&#xff08;1&#xff09;快速入门 SpringBoot形式创建 Maven形式创建&#xff1a; 加入依赖&#xff1a; 创建启动类&#xff1a; 设置头文件 就想Jsp的<%Page %>一样 &#xff0c;Thymeleaf的也要引入标签规范。不加这个虽然不影响程序运行&#xff0c;但是你的idea…

【楚怡杯】职业院校技能大赛 “Python程序开发”赛项样题三

Python程序开发实训 &#xff08;时量&#xff1a;240分钟&#xff09; 中国XX 实训说明 注意事项 1. 请根据提供的实训环境&#xff0c;检查所列的硬件设备、软件清单、材料清单是否齐全&#xff0c;计算机设备是否能正常使用。 2. 实训结束前&#xff0c;在实训平台提供的…

vue项目实现堆叠卡片拖动切换效果

实际效果 实现流程 1. 实现卡片位置堆叠 将父元素的 position 设置成relative &#xff0c;卡片的position 设置成 absolute 即可。 2. 消除图片的移动 如果卡片上有图片&#xff0c;默认拖动的时候就会导致像上图一样变成了选中图片移动&#xff0c;从而没法触发拖动事件。消…

用Vue3和Plotly.js绘制交互式3D小提琴图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue 中使用 Plotly.js 创建小提琴图 应用场景介绍 小提琴图是一种统计图&#xff0c;用于显示数据的分布和中心趋势。它结合了箱线图和密度图的特点&#xff0c;可以直观地展示数据的分散性和形状。 代码基本…

python如何进行pip换源

hello&#xff0c;大家好&#xff0c;我是一名测试开发工程师&#xff0c;至今已在自动化测试领域深耕9个年头&#xff0c;现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦&#xff0c;请大家快来体验并关注我吧。 Python的包管理工具pip是开发者必备的利器之一。然…

YOLOv9:一个关注信息丢失问题的目标检测

本文来自公众号“AI大道理” 当前的深度学习方法关注的是如何设计最合适的目标函数&#xff0c;使模型的预测结果最接近地面的真实情况。同时&#xff0c;必须设计一个适当的体系结构&#xff0c;以方便获取足够的预测信息。 现有方法忽略了一个事实&#xff0c;即输入数据在逐…

理解JS与多线程

理解JS与多线程 什么是四核四线程&#xff1f; 一个CPU有几个核它就可以跑多少个线程&#xff0c;四核四线程就说明这个CPU同一时间最多能够运行四个线程&#xff0c;四核八线程是使用了超线程技术&#xff0c;使得单个核像有两个核一样&#xff0c;速度比四核四线程有多提升。…

el-scrollbar实现自动滚动到底部(AI聊天)

目录 项目背景 实现步骤 实现代码 完整示例代码 项目背景 chatGPT聊天消息展示滚动面板&#xff0c;每次用户输入提问内容或者ai进行流式回答时需要不断的滚动到底部确保展示最新的消息。 实现步骤 采用element ui 的el-scrollbar作为聊天消息展示组件。 通过操作dom来实…

Linux学习看这一篇就够了,超超超牛的Linux基础入门

引言 小伙伴们&#xff0c;不管是学习c还是学习其他语言在我们学的路上都绕不过操作系统&#xff0c;而且&#xff0c;老生常谈的Linux更是每个计算机人的必修&#xff0c;那么我们对Linux的了解可能只是从别人那听到的简单的这个系统很牛&#xff0c;巴拉巴拉的&#xff0c;但…

挑战全网最清晰解决文本文件乱码方案

标题 文本文件出现乱码之全网最清晰解决方案乱码出现的原因解决方案第一步&#xff1a;获取文件的原始编码格式。第二步&#xff0c;获取当前系统的格式第三步&#xff0c;将文件的内容以当前系统编码格式进行译码并且输出到新的文件中第四步&#xff0c;删除原文件&#xff0c…