一、什么是一致性
二、关于一致性的案例
三、如何解决一致性问题
3.1 酸碱平衡理论
3.2 分布式一致性协议
3.3 保持最终一致性的六种模式
四、超时处理模式
4.1 同步调用模式
4.2 同步调用模式下的超时问题解决方案
4.3 接口异步调用模式
4.4 接口异步调用模式下的超时问题解决方案
4.5 消息队列异步处理模式
4.6 消息队列异步处理模式下的超时问题解决方案
五、同步异步的抉择
六、超时补偿的原则
一、什么是一致性
微服务是对单体系统进行拆分后得到,通过拆分可以有效的实现敏捷开发和自动化部属;同时也会遇到数据模型和服务之间不一致的问题。在微服务架构下,不同的服务之间通过网络进行通信;如何让服务之间高效的通信和协作?如何解决服务之间状态的不一致?
一致性是指分布式服务化系统之间的弱一致性,分为应用系统的一致性和数据的一致性。
分布式微服务系统中一般会有很多单一功能的模块,或者同一个功能池中的多个节点,如何保证他们的信息,工作进度,状态的一致性并且有条不紊地完成工作?
二、关于一致性的案例
2.1 实际问题一
电商系统中如何保证下订单和扣库存一致?先下订单,扣库存失败,会导致超卖;下订单不成功,扣库存成功,导致少卖。
2.2 实际问题二
同步调用超时问题,系统A调用系统B超时,系统A可以明确得到超时反馈,但是无法确认系统B是否已经完成了预设功能,于是系统A不知道应该继续做什么,应该如何反馈给使用方。
2.3 实际问题三
异步回调超时问题,系统A同步调用系统B发起指令,系统B采用受理模式,受理后则返回成功信息;然后系统B处理后异步通知系统A处理结果。在这个过程中,如果系统A由于某种原因迟迟没有收到回调结果,两个系统间的状态就不一致。
2.4 实际问题四
缓存和数据库不一致,系统的数据库难以抗住大规模的读流量,一般在数据库前边加一层缓冲,那么缓冲和数据库之间的数据如何保持一致性?
2.5 实际问题五
本地缓冲节点之间不一致,一个服务池上的多个节点为了满足较高的性能需求,需要使用本地缓冲,这样每个节点都会有一份缓冲数据的复制。各个节点的数据更新是有先后顺序的,在更新的瞬间,在某个时间窗内各个节点的数据是不一致的。
2.6 缓冲数据结构不一致
系统在缓冲中暂存了某种类型的数据,该数据由多个数据元素组成,如果一部分数据元素获取成功,一部分过去失败;这个不完全的数据类型就会存入缓冲。
三、如何解决一致性问题
3.1 酸碱平衡理论
关系型数据库满足原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability) ACID英文意思酸。
具有酸特性的数据库支持强一致性,强一致性代表数据库本身不会出现不一致,每个事务都是原子的,或者成功后或者失败,事物之间是隔离的,互相完全不收影响而且最终状态是持久的。
所谓强一致性就是数据库会从一个明确的状态过渡到另外一个明确的状态,中间临时状态是不会出现的,出现也会计时自动修复。
由 强一致性 到 最终一致性:
使用关系型数据库的强一致性数据量较小的需求,在微服务系统中,我们无法将相关数据分到同一个数据库分片,这时就需要实现最终一致性。
衡量分布式系统一般会用一致性(Consistency),可用性(Availability),分区容忍性(Partition tolerance)。
一致性要求所有数据备份同一时刻具有同样的值,可用性要求在任何故障模型下有限时间内处理完成并进行响应,分区容忍性要求网络上有部分消息丢失,到系统任然可以继续工作。
关系型数据库可以满足一致性和可用性,不具有分区容忍性;分布式系统满足分区容忍性,但必须在一致性和可用性之间进行权衡。
例如有消息丢失,复制操作可能被延后,如果我们选择复制完再返回,有限时间内无法返回,失去了可用性;如果不等待复制完成,直接返回,具有了可用性,失去了一致性。
具有BA(basically Available)基本可用,S(Soft State)软状态,E(Eventually Consistent)最终一致思想的成为(BASE)碱思想。解决了分布式系统一致性和可用性不可兼得的问题,它通过牺牲强一致性获得可用性,通过达到最终一致性来尽量满足业务的绝大多数请求。
软状态是实现碱思想的方法,基本可用和最终一致是目标。应用碱思想的系统,由于不保证强一致性,系统在处理请求的过程中可以存在短暂的不一致,在短暂不一致的时间窗口内,请求处于临时状态中,系统在进行每步操作时,通过记录每个临时状态,在系统出现故障时可以从这些中间状态继续处理未完成的请求或者回退到原始状态,最终达到一致状态。
酸碱中和是指,系统中相关数据不能分到同一分片上,无法保证强一致性,酸特性;就需要实现最终一致性,碱特性;通过软状态来实现基本可用和最终一致。
3.2 分布式一致性协议
分布式事务处理模型(distributed transaction service)DTS规定了分布式一致性协议,包括两阶段提交和三阶段提交的保证强一致性的协议,阿里也提出了TCC协议,try confirm cancel来保证一致性。现实系统的底线是仅仅需要达到最终一致性,不需要专业复杂的一致性协议。人们在实践中提出了保持最终一致性的六种模式。
3.3 保持最终一致性的六种模式
四、超时处理模式
4.1 同步调用模式
4.2 同步调用模式下的超时问题解决方案
4.3 接口异步调用模式
4.4 接口异步调用模式下的超时问题解决方案
4.5 消息队列异步处理模式
4.6 消息队列异步处理模式下的超时问题解决方案
五、同步异步的抉择
六、超时补偿的原则