找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3569

积分

0

好友

473

主题
发表于 4 小时前 | 查看: 6| 回复: 0

系统设计核心缩写概览:CAP、BASE、SOLID、KISS 图示

软件工程里藏着许多用缩写表示的经典设计原则和定理。今天我们就来聊聊最常见的四个:CAP、BASE、SOLID 和 KISS。

CAP 定理

CAP 定理是分布式系统领域最重要的理论之一。它明确指出:在分布式数据存储系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三者最多只能同时满足两项。

C - Consistency(一致性)

所有节点在同一时间看到的数据完全一致。写操作一旦成功,后续的任何读操作都能立刻返回最新值。
例子:银行账户余额,必须强一致,绝不能出现透支。

A - Availability(可用性)

每个请求都能收到响应(无论成功或失败),系统始终保持可用。
例子:电商网站在大促期间,即便部分服务器挂了,也要继续提供下单服务。

P - Partition tolerance(分区容错性)

网络分区(节点之间通信中断)发生时,系统仍然可以继续运转。
关键点:由于网络分区在实际环境中几乎无法避免,我们只能在 C 和 A 之间做权衡。

现实中的选择

CP 系统:选择一致性与分区容错,必要时牺牲可用性  

  • 举例:ZooKeeper、etcd、Consul  
  • 场景:配置中心、服务发现、分布式锁  

AP 系统:选择可用性与分区容错,允许弱化一致性  

  • 举例:Cassandra、DynamoDB、Eureka  
  • 场景:社交网络、日志系统、会话存储  

注意:Martin Kleppmann 等专家曾批评过简单地把数据库归为 CP 或 AP 的做法。真实系统要复杂得多,通常都会提供可调节的一致性级别,而不是非黑即白。

BASE 原则

BASE 是 Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)的缩写。它代表了 NoSQL 数据库典型的设计哲学,与关系数据库的 ACID 形成鲜明对照。

Basically Available(基本可用)

系统出现故障时,允许损失部分可用性,但绝不是完全不可用。
例子:电商大促时,主动降级非核心功能(比如关掉推荐模块),全力保证下单链路畅通。

Soft state(软状态)

允许系统中的数据存在中间状态,也就是说不同节点的数据副本可以暂时不一致。
例子:用户刚改了昵称,不同节点在很短的时间内可能展示出新旧两个名字。

Eventually consistent(最终一致性)

不追求实时的一致性,但保证经过一段时间后,所有副本最终都会收敛到相同的状态。
例子:DNS 记录的传播、数据库的主从同步都有延迟,但最终总会一致。

BASE vs ACID

特性 ACID BASE
一致性 强一致性 最终一致性
可用性 事务失败时不可用 基本可用
适用 关系数据库 NoSQL 数据库
场景 金融交易 社交网络

SOLID 原则

SOLID 是面向对象设计的五大原则,由 Robert C. Martin(Bob 大叔)整理总结。

S - Single Responsibility Principle(单一职责原则)

一个类应该只有一个引起它变化的原因。
反例:一个类既要处理订单的业务逻辑,又自己连接数据库存储,还顺手写日志。
正例:拆成 OrderServiceOrderRepositoryLogger 三个类,各司其职。

O - Open/Closed Principle(开闭原则)

对扩展开放,对修改关闭。
含义:想添加新功能时,应该通过新增代码来实现,而不是改动已有的成熟代码。
实现方式:抽象类、接口、策略模式。

L - Liskov Substitution Principle(里氏替换原则)

子类必须能够无缝替换父类,且不会破坏程序的正确性。
反例:让 Square(正方形)继承 Rectangle(长方形),但 setWidthsetHeight 的行为互相冲突。
正例:用接口定义行为契约,让子类去实现接口。

I - Interface Segregation Principle(接口隔离原则)

客户端不应该被迫依赖它用不到的接口。
反例:一个大胖接口塞了 20 个方法,所有实现类都不得不把不需要的方法空实现一遍。
正例:拆成多个精简的小接口,实现类只干自己该干的活。

D - Dependency Inversion Principle(依赖倒置原则)

高层模块不应该依赖低层模块,二者都应该依赖抽象。
含义:借助依赖注入、控制反转这些手段,降低模块间的耦合度。
例子:Service 层只依赖 Repository 接口,而不是某个具体的 MySQLRepository 类。

KISS 原则

KISS = Keep It Simple, Stupid(保持简单,傻瓜)

这个原则最早可以追溯到 1960 年代的美国海军。它的核心思想就是:系统应当尽可能保持简单,因为简单的系统才好理解、好维护、好扩展。

如何做到 KISS?

  • 避免过度设计:不要为臆想中的未来需求写一堆复杂的代码  
  • 优先使用成熟方案:别动不动就自己造轮子  
  • 减少依赖:每多引入一个依赖,就等于多了一份复杂性  
  • 清晰的命名:好的名字能显著减少注释,提升可读性  
  • 小而美的函数:一个函数只专注做好一件事

KISS vs 过度工程

过度工程的典型迹象:  

  • 明明问题很简单,却硬上了一堆复杂的设计模式  
  • 抽象了多层接口,到头来只有一种实现  
  • 为了“可能未来的需求”,提前写了大量无人问津的配置项  

记住:判断标准不是“将来可能用到”,而是“现在确实需要”。

总结

这些原则各有侧重:  

  • CAP:分布式系统的理论基石,帮我们理解核心权衡  
  • BASE:NoSQL 的实践哲学,可用性优先,接受最终一致  
  • SOLID:面向对象设计的指导手册,帮你写出耐操的好代码  
  • KISS:普适的设计哲学,简单才是王道  

它们是指南,绝非教条。实际工作中要根据场景灵活取舍,千万别为了死守原则而掉进过度设计的坑里。如果你对 CAP、BASE、SOLID 等设计原则有独到见解,欢迎到云栈社区分享你的心得。




上一篇:手机NPU图像去噪新思路:硬件优先设计让推理比GPU快3.88倍
下一篇:undoredo:基于增量记录的 Rust 撤销重做库,让你的数据结构拥有“后悔药”
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-5-7 10:33 , Processed in 0.621886 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表