1、什么是一致性
一致性指分布式服务化系统之间的弱一致性,包括应用系统的一致性和数据的一致性。无论是水平拆分还是垂直拆分,都解决了特定场景下的特定问题,但拆分后的系统或者服务化的系统的最大问题就是一致性问题:如何保这么多单一功能的模块的信息、工作进度、状态一致并且协调有序地工作?
2、一致性问题
-
下订单和扣库存
-
同步调用超时
-
异步回调超时
-
掉单
-
系统间状态不一致
-
缓存和数据库不一致
-
本地缓存节点间不一致
-
缓存数据结构不一致
3、解决一致性问题的模式和思路
3.1 酸碱平衡理论
- ACID(酸)
A: Atomicity,原子性
C: Consistency,一致性
I: Isolation,隔离性
D: Durability,持久性
关系型数据库天生用于解决具有复杂事务场景的问题,完全满足ACID的特性。
具有ACID特性的数据库支持强一致性,强一致性代表数据库本身不会出现不一致,每个事务都是原子的,或者成功或者失败,事务间是隔离的,互相完全不受影响,而且最终状态是持久落盘的。
NoSQL完全不适合交易场景,主要用来做数据分析、ETL、报表、数据挖掘、推荐、日志处理、调用链跟踪等非核心交易场景。
现在我们来看看下订单和扣库存一致性问题,如果是在数据量较小的情况下,可以利用关系型数据库的强一致性解决,也就是把订单表和库存表放在同一个关系型数据库中,利用关系型数据库进行下订单和扣库存两个紧密相关的操作,达到订单和库存实时一致的结果。如果是大规模高并发的情况,由于业务规则的限制,无法将相关数据分到同一个数据库分片,这时就需要实现最终一致性。
- CAP(帽子原理)
由于对系统或者数据进行了拆分,我们的系统不再是单机系统,而是分布式系统。
C: Consistency,一致性。在分布式系统中的所有数据备份,在同一时刻具有同样的值,所有节点在同一时刻读取的数据都是最新的数据副本。
A: Availability,可用性,好的响应性能。完全的可用性指的是在任何故障模型下,服务都会在有限的时间内处理完成并进行响应。
P: Partition tolerance,分区容忍性。尽管网络上有部分消息丢失,但系统仍然可继续工作。
CAP原理证明,任何分布式系统只可同时满足以上两点,无法三者兼顾。由于关系型数据库是单节点无复制的,因此不具有分区容忍性,但是具有一致性和可用性,而分布式的服务化系统都需要满足分区容忍性,那么我们必须在一致性和可用性之间进行权衡。
- BASE(碱)
BASE思想解决了CAP提出的分布式系统的一致性和可用性不可兼得的问题。BASE思想与ACID原理截然不同,它满足CAP原理,通过牺牲强一致性获得可用性,一般应用于服务化系统的应用层或者大数据处理系统中,通过达到最终一致性来尽量满足业务的绝大多数需求。
酸碱平衡理论,简单来说就是在不同的场景下,可以分别利用ACID和BASE来解决分布式服务化系统的一致性问题。
BA: Basically Available,基本可用
S: Soft State,软状态,状态可以在一段时间内不同步
E: Eventually Consistent,最终一致,在一定的时间窗口内,最终数据达成一致即可
软状态是实现BASE思想的方法,基本可用和最终一致是目标。以BASE思想实现的系统由于不保证强一致性,所有系统在处理请求的过程中存在短暂的不一致,在短暂的不一致的时间窗口内,请求处理处于临时状态中,系统在进行每步操作时,通过记录每个临时状态,在系统出现故障时可以从这些中间状态继续处理未完成的请求或者退回到原始状态,最终达到一致状态。
- 对酸碱平衡的总结
解决一致性问题的三条实践经验:使用向上扩展(强悍的硬件)并运行专业的关系型数据库,能够保证强一致性;关系型数据库水平伸缩和分片,将相关数据分到数据库的同一个片上;最终一致性。
3.2 分布式一致性协议
分布式事务处理模型(DTS):应用程序、事务管理器、资源管理器和通信资源管理器。
- 两阶段提交协议:准备阶段、提交阶段
致命的问题
1. 阻塞:准备阶段会锁定资源,直到下一步完成。
2. 单点故障:如果协调者(事务管理器)宕机,会一直阻塞。
3. 脑裂:协调者发送提交命令,有些参与者没有收到,不会执行事务。多个参与者之间不一致。
- 三阶段提交协议:询问阶段、准备阶段、提交阶段
- TCC:Try、Confirm、Cancel
3.3 保证最终一致性的模式
实现最终一致性非常有效、简单的模式。
- 查询模式:每个服务操作都需要有唯一的流水号标识。
- 补偿模式:自动恢复、通知运营、技术运营。
- 异步确认模式:将要执行的异步操作封装后持久入库,然后通过定时捞取未完成的任务进行补偿操作来实现异步确保模式。
- 定期校对模式:需要全局唯一ID
- 可靠消息模式
- 缓存一致性模式
3.4 超时处理模式
- 微服务的交互模式:同步调用模式、接口异步调用模式、消息队列异步处理模式
- 同步与异步的抉择
- 交互模式下超时问题的解决方案
- 超时补偿的原则