一、背景:
- 随着业务的发展单节点服务器无法满足人们的需求,服务节点开始池化,将任务有序合理的进行分配和管理,就需要进行服务拆分。
服务拆分分为水平拆分和垂直拆分。
服务水平拆分:
- 单节点不能满足性能需求可以采用为多节点,多个节点共同处理同一个请求。(可以理解成服务集群)
服务垂直拆分:
- 按照服务功能进行拆分,将一根复杂的功能拆分为多个单一简单的功能。(可以理解为模块化)
拆分后的系统最大的问题就是一致性:
- 模块之间保证数据,信息,状态的一致性工作
二、一致性相关理论(酸碱平衡)
2.1、ACID
2.1.1、ACID理论
- 关系型数据库天生具有处理复杂事物场景问题
A:Actomicity 原子性
- 是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作(理解为原子不可再分割)
C:Consistency 一致性
- 事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少(理解为同一个事务下所有操作结果一致)
I:Isolation 隔离性
- 隔离性表示各个事务之间不会互相影响(理解为事务之间相互独立)
D:Durability 持久性
- 持久性表示一旦一个事务成功了,那么他的改变是永久性的被记录和操作(事务成功后不会被改变)
2.1.2、一致性问题
问题:电商中下单与库存
场景:下单系统和库存操作如何保持一致性。
- 如果下单成功扣取库存失败导致超卖,如果下单不成功库存扣取成功会导致少卖
解决方案:(利用关系型数据库强一致性特性解决)
数据量比较少的情况:
- 把订单表和库存表放在同一个关系型数据库,下单和扣库存操作紧密达到一致性
数据量比较多的情况:
- 把订单表和库存表放在同一个数据库分片,下单和扣库存操作紧密达到一致性
2.1.3、注意:
- 1、交易系统提高性能可以采用向上扩展(硬件升级),是最简单有效的方式
- 2、NoSQL不适合做交易场景,主要用于数据分析,ETL,报表,数据挖掘,推荐,日志处理,调用链路跟踪操作
2.2、CAP
2.2.1、分布式CAP理论(帽子理论)
C:Consistency 一致性。
- 分布式系统中所有数据在同一时刻都是形同
A:Availbility 可用性
- 在任何模型下服务都会在有限的时间进行处理并相应
P:Partition tolerance 分区容忍性
- 有部分消息丢失,系统仍然可以继续工作
2.2.2、说明
1、任何分布式系统不能三者兼顾只能同时满足两点
2、关系型数据库具有一致性,联合分布式则需要在一致性和可用性选择
2.3、BASE
2.3.1、BASE模型
- BASE思想解决了CAP的一致性与可用性不可兼得的问题,通过牺牲强一致性获取可用性
BA:Basically Available 基本可用
S:Solft 软状态,在一段时间内部同步
E:Eventually Consistent 最终一致,数据在最终达成一致性
2.3.2、说明
- 1、软状态是实现方法,基本可用和最终一致性是目标
- 2、通过不保证强一致性,在系统处理请求过程中有短暂的不一致,系统的每一步操作都记录状态,出现异常则处理未完成的请求或回退,达到最终的一致性
2.3.3、一致性问题
问题:交易系统转账
场景:(A向B转账)
- A准备转账,从A中扣除金额,B中增加金额,转账成功(4个阶段)