传统ACID
ACID有很强的一致性,伸缩性非常差。BASE一致性弱,有很好的伸缩性,可以异步批量处理,适合分布式事务。
解释下ACID含义
- 原子性
- 一致性
- 隔离性
- 持久性
微服务系统下不适合这种强一致性的要求,很难满足高性能要求。
分布式BASE
"BASE 原理为了提升分布式系统的可用性,允许短时间内的数据不一致,之后通过异步补偿机制最终达到一致性。"
解释下BASE含义
- Basic Availaability:基本可用
- Soft-state:软状态
- Eventual Consistency:最终一致性
BASE允许出现短暂问题,分布式系统下出现故障是不可避免,我们可以设计出更加有弹力的系统。短时间内就算有数据不同步风险,允许新的交易发生,在业务上将可能出现问题的事务处理掉,保证最终一致性。
通过实际场景分析ACID和BASE
ACID,大家在买同一本书时候,每个用户购买请求需要把库存锁住,等减完库存后,释放锁,后续的人才能购买。
BASE,大家同时下单,这时不是去分配库存,系统先异步批量处理订单,当库存没有了,告诉用户你没有购买成功。
业务补偿
微服务涉及到多个服务之间的协调,保证每一个服务都成功,否则整个事务就是失败的。对于业务补偿,将服务变成幂等性,如果一个事务失败或者超时,我们需要不断重试,达到我们想要的状态。如果达不到我们想要的,就把服务恢复到原来的状态。
满足以下几点补偿
- 清楚地描述出要达到什么样的状态,如果不满足其中的条件,我们要回退到哪一个状态
- 整条业务跑起来的时候,我们可以串行或者并行地做这些事
- 对于已经完成的事务进行整体修改,可以考虑成一个修改事务
业务补偿设计
- 把一个业务流程执行完成
- 执行不下去,需要启动补偿机制,回滚业务流程