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

本文对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.rhkb.cn/news/372191.html

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

相关文章

98.验证二叉搜索树——二叉树专题复习

递归: class Solution {// 判断二叉搜索树是否有效public boolean isValidBST(TreeNode root) {// 递归地检查以 root 为根的子树是否满足 BST 的性质// 同时定义一个范围 [Long.MIN_VALUE, Long.MAX_VALUE] 来约束节点的值return isValidBST(root, Long.MIN_VALUE…

SpringBoot拦截器

目录 一、拦截器快速入门 (1)什么是拦截器 (2)拦截器的使用步骤 1、定义拦截器 🍀preHandle() 方法 🍀postHandle() 方法 🍀afterCompletion() 方法 2、注册配置拦截器 二、拦截器详解…

中国剩余定理

模板代码&#xff1a; #include<bits/stdc.h> using namespace std; using ll long long; #define fi first #define se second const ll mod998244353; const int N2e510; #define int llint n,m[300],r[300]; int exgcd(int a,int b,int &x,int &y){if(b0){x…

如何用Vue3和Plotly.js打造交互式仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 Plotly.js 创建指示器卡片 应用场景介绍 指示器卡片是一种用于可视化数据并提供关键见解的交互式组件。它们通常用于仪表板、分析应用程序和监控系统。Plotly.js 是一个流行的 JavaScript 库&a…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

Face_recognition实现人脸识别

这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…

无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages

ubuntu系统执行sudo apt update命令的时候&#xff0c;遇到如下问题&#xff1a; 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…

Oracle 19c 统一审计表清理

zabbix 收到SYSAUX表空间告警超过90%告警&#xff0c;最后面给出的清理方法只适合ORACLE 统一审计表的清理&#xff0c;传统审计表的清理SYS.AUD$不适合&#xff0c;请注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

Vue 3 中集成 ECharts(附一些案例)

Vue 3 中集成 ECharts 的完全指南 引言 在现代Web开发中&#xff0c;Vue 3以其卓越的性能和灵活的Composition API赢得了广泛的关注。而ECharts&#xff0c;作为开源的一个使用JavaScript实现的强大可视化库&#xff0c;以其丰富的图表类型和高度可定制性成为了数据可视化的首…

EAI四个层次服务-系统架构师(二十六)

1、&#xff08;重点&#xff09;系统应用集成提供了4个不同层次服务&#xff0c;最上层服务是&#xff08;&#xff09;服务。 解析: EAI&#xff08;Enterprise Application Integration&#xff09;系统应用集成&#xff0c;相关概念。 实施EAI必须保证&#xff1a;应用程…

超详细版阿里云控制台环境配置+数据库配置

一、登录阿里云控制台 登录阿里云控制台&#xff0c;找到实例&#xff0c;切到阿里云服务器所在地址 &#x1f36d;不知道自己的服务器地址在哪边也没有关系&#xff0c;随便选择一个&#xff0c;查询不到记录的话会有以下提示&#xff0c;可以根据提示进行切换&#xff08;适…

贝叶斯估计(1):期末大乱炖

写在前面&#xff01; 1 先验分布和后验分布 三种信息&#xff1a;总体信息、样本信息、先验信息 总体信息&#xff1a;“总体是正态分布”&#xff1b;样本信息&#xff1a;总体抽取的样本提供的信息&#xff0c;是最新鲜的信息&#xff1b;先验信息&#xff1a;在抽样之前就…

罗剑锋的C++实战笔记学习(二):容器、算法库、多线程

4、容器 1&#xff09;、容器的通用特性 所有容器都具有的一个基本特性&#xff1a;它保存元素采用的是值&#xff08;value&#xff09;语义&#xff0c;也就是说&#xff0c;容器里存储的是元素的拷贝、副本&#xff0c;而不是引用 容器操作元素的很大一块成本就是值的拷贝…

DBA 数据库管理

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

浅谈信息技术高效课堂管理:策略、技巧与实践

引言&#xff1a; 在信息化教育的浪潮中&#xff0c;信息技术课程正逐渐成为学校教育体系中的重要组成部分。然而&#xff0c;信息技术课堂的特殊性——高互动性、高度依赖电子设备&#xff0c;给课堂管理带来了前所未有的挑战。如何在保证教学效率的同时&#xff0c;维护良好…

多端多商户自定义DIY商城小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;电子商务的发展日新月异&#xff0c;为了满足不断变化的市场需求和用户期望&#xff0c;我们自豪地推出了一款具有前瞻性的创新产品——多端多商户自定义 DIY 商城小程序源码系统。这款系统不仅具备前后端分离的先进架构&#xff0c;还配…

git 禁止dev合并到任何其他分支

创建 pre-merge-commit 钩子 导航到 Git 仓库的钩子目录&#xff1a; cd /path/to/your/repo/.git/hooks创建或编辑 pre-merge-commit 钩子&#xff1a; 也可以通过指令创建 nano pre-merge-commit在钩子文件中添加以下代码&#xff1a; #!/bin/sh# 获取当前分支名称 curr…

使用tcpdump抓取本本机的所有icmp包

1、抓取本机所有icmp包 tcpdump -i any icmp -vv 图中上半部分&#xff0c;是源主机tmp179无法ping通目标主机192.168.10.79&#xff08;因为把该主机关机了&#xff09;的状态&#xff0c;注意看&#xff0c;其中有unreachable 图中下半部分&#xff0c;是源主机tmp179可以p…

RIP环境下的MGRE网络

首先将LSP的IP地址进行配置 其他端口也进行同样的配置 将serial3/0/1配置25.0.0.2 24 将serial4/0/0配置35.0.0.2 24 将GE0/0/0配置45.0.0.2 24 进行第二步 R1与R5之间使用ppp的pap认证 在R5中进行配置 在aaa空间中创建账号和密码 将这个账号和密码使用在ppp协议中 然后…

什么是静态住宅代理?一文看懂它

静态住宅代理&#xff08;也称为 ISP 代理&#xff09;是最流行的代理类型之一。它们也是隐藏身份和在线匿名的最佳方式之一。但是您需要了解它们什么&#xff1f;是什么让它们如此特别&#xff1f;为什么您要使用住宅代理而不是仅仅使用常规代理服务&#xff1f;如果你感兴趣&…