软件开发中的基本原则(SOLID)
S 单一原则
一个对象应该只包含单一的职责,并且该职责被完整地封装到一个类中,即有且只有一个原因是类变更。
O 开放封闭原则
对扩展开放,对修改关闭。而实现开闭原则的关键就是抽象化。
L 里氏替换原则
任何基类可以出现的地方,子类也可以出现。这是保证继承复用的基础。
I 接口隔离法则
客户端不应该依赖那些它不需要的接口。使用多个专门的接口,而不使用单一的总接口。可以在进行系统设计时采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,而隐藏用户不需要的行为。
D 依赖倒置原则
高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应当依赖于细节;细节应当依赖于抽象;要针对接口编程,不针对实现编程。
合成/聚合复用原则
要尽量使用对象组合,而不是继承关系达到软件复用的目的。
迪米特法则
系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度。狭义法则:如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
面向对象设计其他原则
封装变化
少用继承 多用组合
针对接口编程 不针对实现编程
为交互对象之间的松耦合设计而努力
类应该对扩展开发 对修改封闭(开闭OCP原则)
依赖抽象,不要依赖于具体类(依赖倒置DIP原则)
密友原则: 只和朋友交谈(最少知识原则,迪米特法则)
分布式理论 - CAP
C代表一致性 (Consistency),A代表可用性 (Availability),P代表分区容错性 (Partition tolerance)。CAP理论告诉我们C、A、P三者不能同时满足,最多只能满足其中两个。
CAP 三选二
一致性 (Consistency): 一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据。所有节点访问同一份最新的数据。
可用性 (Availability): 对数据更新具备高可用性,请求能够及时处理,不会一直等待,即使出现节点失效。
分区容错性 (Partition tolerance): 能容忍网络分区,在网络断开的情况下,被分隔的节点仍能正常对外提供服务。
一般来说使用网络通信的分布式系统,无法舍弃P性质,那么就只能在一致性和可用性上做一个艰难的选择。但实际上C与A之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同。所以一致性和可用性并不是水火不容,非此即彼的。Paxos、Raft等分布式一致性算法就是在一致性和可用性之间做到了很好的平衡的见证。
分布式理论 - BASE
BASE 理论是对 CAP 理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP 的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
Basically Available(基本可用)
分布式系统在出现不可预知故障的时候,允许损失部分可用性。
Soft state(软状态)
软状态也称为弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
Eventually consistent(最终一致性)
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
CAP 与 BASE 关系
BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),更具体地说,是对 CAP 中 AP 方案的一个补充。其基本思路就是:通过业务,牺牲强一致性而获得可用性,并允许数据在一段时间内是不一致的,但是最终达到一致性状态。
CAP 与 ACID 关系
ACID 是传统数据库常用的设计理念,追求强一致性模型。BASE 支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
ACID 和 BASE 代表了两种截然相反的设计哲学,在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此 ACID 和 BASE 又会结合使用。
事务理论 - ACID
什么是ACID
一个事务有四个基本特性,也就是我们常说的(ACID):
Atomicity(原子性):事务是一个不可分割的整体,事务内所有操作要么全做成功,要么全失败。
Consistency(一致性):务执行前后,数据从一个状态到另一个状态必须是一致的(A向B转账,不能出现A扣了钱,B却没收到)。
Isolation(隔离性): 多个并发事务之间相互隔离,不能互相干扰。
Durability(持久性):事务完成后,对数据库的更改是永久保存的,不能回滚。
ACID靠什么保证
以MySQL为例:
A原子性由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql
C一致性一般由代码层面来保证
I隔离性由MVCC来保证
D持久性由内存+redo log来保证,mysql修改数据同时在内存和redo log记录这次操作,事务提交的时候通过redo log刷盘,宕机的时候可以从redo log恢复。
详细实现原理可以结合事务篇一起深入了解。