概念
并没有一种分布式事务的服务或者组件,能帮我们很简单地就解决分布式系统下的数据一致性问题。我们在使用分布式事务时,更多的情况是,用分布式事务的理论来指导设计和开发,自行来解决数据一致性问题。
分布式事务也需要遵从ACID,但是不能完全兼顾,会有取舍。
2PC
引入协调者角色,协调事务的提交。
所谓的二阶段指的是准备阶段和提交阶段。
在准备阶段,协调者分别给各系统发送“准备”命令,各系统收到准备命令之后,开始执行准备操作。准备阶段都需要做哪些事儿呢?你可以理解为,除了提交数据库事务以外的所有工作,都要在准备阶段完成。
协调者在收到各系统“准备成功”的响应之后,开始进入第二阶段。提交阶段就比较简单了,协调者再给各系统发送“提交”命令,每个系统提交自己的数据库事务,然后给协调者返回“提交成功”响应,协调者收到所有响应之后,给客户端返回成功响应,整个分布式事务就结束了。
时序图:
异常情况: 在准备阶段:有任何错误,就触发回滚。
提交阶段:必须成功,通过重试直至提交成功。提交过程非常简单,出问题概率较小。
实现2pc时,可以把协调者进程放在一个参与者中=,可以减少通信成本、减少故障点。
2pc缺点:性能不高,协调者是单点。所以,只有在需要强一致、并且并发量不大的场景下,才考虑使用 2PC。
本地消息表
一个系统在本地消息表记录需要异步更新的系统,再用一个异步服务,去读取本地消息,调用另一个系统接口执行更新,更新成功后把本地消息状态更新为已完成;更新失败,则进行重试。
消息队列 RocketMQ 提供一种事务消息的功能,其实就是本地消息表思想的一个实现。使用事务消息可以达到和本地消息表一样的最终一致性,相比我们自己来实现本地消息表,使用起来更加简单,你也可以考虑使用。
使用场景:一致性要求不高,最终一致即可,异步操作不依赖资源。
此文章为3月Day5学习笔记,内容来源于极客时间《后端存储实战课》