什么是分布式系统?
部署在不同节点上的系统通过网络交互来完成协同工作的系统
什么是事务?
事务是由一组操作组成的单元。事务具有ACID特性
什么是本地事务?
本地事务就是用关系数据库来控制事务。
什么是分布式事务?
在分布式系统中一次操作由多个系统协同完成,这种一次事务操作涉及多个系统通过网络协同完成的过程称为分布式事务。
CAP理论
分布式系统在设计时只能在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)中满足两种,无法兼顾三种
一致性:节点的数据一致性
可用性:一个节点宕机不影响系统的使用
分区容忍性:解决网络分区导致数据的不完整及无法访问等问题
网络分区:分布式系统多个系统之前系统工作,节点之间出现网络中断、网络延迟等现象,导致数据分散在不同的节点上。
在保证分区容忍性的前提下,一致性和可用性是相对的
CAP有哪些组合?
CA:不使用微服务,通过数据库保证一致性。通过数据库分表分库保证可用性,通过数据库事务保证一致性
CP:放弃一致性,加强可用性和分区容忍性,追求最终一致性,很多NoSQL数据库按照AP进行设计。
AP:放弃可用性,加强一致性和分区容忍性,一些强一致性要求的系统按CP进行设计,比如跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。
解决方案
1、两阶段提交(2PC)
2、事务补偿(TCC)
3、消息队列实现最终一致性
两阶段提交2PC
两个阶段三个操作 主要应用于关系型数据库,微服务用的比较少
1、第一阶段:准备阶段(prepare)
2、第二阶段:提交(commit)/回滚(rollback)阶段
以下单为例:
1、应用程序连接订单系统数据库和库存系统数据库
2、应用程序通过事务协调器分别向订单系统数据库和库存系统数据库发起prepare,两个数据库分别执行本地事务并记录日志,但不提交,如果成果返回yes,如果失败返回no
3、事务协调器收到回复,只要有一方回复no则分别向参与者发起回滚事务
4、事务协调器收到回复,全部回复yes,参与者开始提交事务。如果参与者有一方提交事务失败则由事务协调器发起回滚事务。
两阶段提交实现了强一致性,但是事务执行时间长,效率低,比较好的解决方案有:springboot+atomikos or bitronix
事务补偿(TCC)
TCC事务补偿是基于2PC实现的业务层事务控制方案,Try、Confirm和Cancel
1、Try检查和预留业务资源
完成提交事务前的检查,并预留好资源
2、Confirm确定执行业务操作
对try阶段预留的资源正式执行
3、Cancel取消执行业务操作
对try阶段预留的资源释放
以下单为例:
1、应用程序分别向订单系统和库存系统进行预生成订单和预减库存(try)
2、应用程序分别向订单系统和库存系统进行下单和减库存操作(confirm)
3、应用程序分别向订单系统和库存系统进行释放资源操作(cancel)
消息队列实现最终一致
分布式事务拆分为多个本地事务来完成,并且有消息队列异步协调完成。
以下单减库存为例:
1、订单系统创建订单插入订单表order ,插入消息表msg
2、异步发送减库存消息(定时任务)
3、库存系统收到消息,减少库存表kucun,插入消息状态表msg_his,想MQ发送异步消息通知订单系统完成库存任务