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

本文对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.mzph.cn/bicheng/43061.shtml

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

相关文章

Sleuth--链路追踪

1 链路追踪介绍 在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成 系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建 在不同的软件模块集上&am…

C++入门基础篇(1)

欢迎大家来到海盗猫鸥的博客—— 断更许久,让我们继续好好学习吧! 目录 1.namespace命名空间 命名空间的存在价值: 命名空间的定义: 命名空间的使用: 2.C输入输出函数 使用: 3.缺省参数 4.函数重载…

理解JS与多线程

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

背包问题转换

如何转换成背包问题呢&#xff0c;我们可以把每个质数当成一个重量 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std;#define int long long int record[1005]; void fun() {//record[2] 1;for (int i 2; i < 1000; i) {if (!record[…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-5.其他话题分享

4.1 可用性威胁与解决方案 挑战1&#xff1a;BlockServer故障影响众多VD 问题描述&#xff1a;单个BlockServer的故障可能会影响到多个虚拟磁盘&#xff08;VDs&#xff09;的正常运作&#xff0c;这是由于传统架构中BlockServer承担了过多的职责&#xff0c;其稳定性直接关系…

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

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

这几类人,千万不要买纯电车

文 | AUTO芯球 作者 | 响铃 纯电车的冤大头真是太多了&#xff0c; 我之前劝过&#xff0c;有些人不适合买纯电车&#xff0c; 你们看&#xff0c;果然吧&#xff0c;麦卡锡最近的一份报告就披露了 去年啊&#xff0c;22%的人在买了电车后后悔了&#xff0c; 这些人说了&a…

c向c++的过渡

目录 1.不同版本的hello word&#xff01; 2.namespace和&#xff1a;&#xff1a;域作用限定符以及using 2.1 namespace 2.2&#xff1a;&#xff1a; 2.3using用于展开域 3.C输入和输出 4.缺省参数 5.重载 6.引用 1.不同版本的hello word&#xff01; 还记得第一次写C语…

第二证券:资金抱团“高股息”,超三成A股年内创历史新低!

A股商场行情冰火两重天。 “预制菜榜首股”跌破发行价 7月8日&#xff0c;味知香盘中最低跌至19.26元/股&#xff0c;股价跌破发行价&#xff0c;并创前史新低。揭露资料显现&#xff0c;公司是集研发、生产、销售为一体的半成品菜企业&#xff0c;现在具有8大产品系列&#…

手机数据恢复:如何在没有root的情况下恢复Android数据?

您是否不小心从Android设备中删除了重要数据&#xff1f;您是否担心如何取回您的照片、视频和文档&#xff1f;有时&#xff0c;我们不小心删除了重要数据&#xff0c;并使用Android root方法取回文件。许多用户不喜欢root他们的Android设备&#xff0c;因为这是一种复杂的方法…

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

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

Python 使用__slots__来限制实例动态添加属性

在Python中&#xff0c;是可以随便在对象实例中动态添加属性的。那么&#xff0c;怎么样可以防止其他人在调用类实例的时候胡乱添加属性和方法&#xff1f; 使用 __slots__ 属性&#xff0c;来限制 class 实例能添加的属性 也就是说&#xff0c;只有在 __slots__ 变量中的属性…

Java---包装类与泛型

1.包装类 1.1 包装类 在Java中&#xff0c;由于基本数据类型不是继承Object类&#xff0c;为了在泛型代码中可以支持基本数据类型&#xff0c;Java给每个基本数据类型各自提供了一个包装类。 如下图 除了char和int基本数据类型的包装类型有点特别&#xff0c;其他的都是首字…

Vue3基础知识:组合式API中的provide和inject,他们作用是什么?如何使用?以及案例演示

1.provide和inject相较于父子传递的不同在于provide,inject可以用于跨层级通信&#xff08;通俗易懂的讲就是可以实现爷孙之间的直接信息传递&#xff09;。 1.跨层级传递数据 1.在顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 演示一&#xff1a;跨…

工业一体机在物流智能设备中的意义

工业一体机在物流智能设备中的应用具有深远的意义&#xff0c;它们为物流行业的数字化转型和智能化升级提供了强大的技术支持。以下是工业一体机在物流智能设备中的几个主要意义&#xff1a; 一、提升物流作业效率 高性能与稳定性&#xff1a;工业一体机采用工业级硬件组件和…

【Ubuntu】windows和Linux文件互传、共享

【Ubuntu】windows和Linux文件互传、共享 一、FTP、SAMBA、NFS简介 FTP: File Transfer Protocol&#xff08;文件传输协议) SAMBA: 基于SMB(Server Message Block服务器消息块)协议的软件实现 NFS: Network File System&#xff08;网络文件系统&#xff09; 二、Linux 共享文…

【信息学奥赛】CSP-J/S初赛07 逻辑运算符与位运算

本专栏&#x1f449;CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容&#xff0c;包含计算机基础、初赛常考的C程序和算法以及数据结构&#xff0c;并收集了近年真题以作参考。 如果你想参加信息学奥赛&#xff0c;但之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#…

私有化要约溢价60%,欧舒丹与投资者的相互成就

港股市场迎来新一轮私有化浪潮。据上海证券报不完全统计&#xff0c;自2023年以来&#xff0c;已有19家港股上市公司完成私有化退市。 对于深陷港股低估值困境的投资者来说&#xff0c;持仓名单里有公司宣布高溢价私有化要约&#xff0c;可谓“喜大普奔”的消息。 上市公司私…

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进

202488读书笔记|《365日创意文案》——无聊的 到底是这世间&#xff0c; 还是自己&#xff1f;懂得忘却的人才能前进 1月2月3月4月5月6月7月8月9月10月11月12月 《365日创意文案》WRITES PUBLISHING&#xff0c;一些日常&#xff0c;是烟火&#xff0c;也是幸福的印记。 当下也…

电脑文件怎么加密?重要文件加密方法介绍

在使用电脑的过程中&#xff0c;我们需要加密保护重要文件&#xff0c;以免重要数据泄露。下面小编就为大家介绍两款文件加密软件&#xff0c;帮助你轻松加密保护重要文件。 超级加密3000 在众多文件加密软件中&#xff0c;超级加密3000凭借超高的加密强度&#xff0c;便捷的操…