简单聊聊分布式事务2PC、3PC、TCC、SAGA、消息一致性?
事务的特性有原子性、一致性、隔离性、持久性;如果项目是单体服务,大多数情况下数据库就可以帮我们搞定,但是从单体服务转变成分布式服务的时候,就需要考虑各个服务之间的事务。
一、2PC
什么是2PC?2PC的过程是什么?有哪些优缺点呢?
怎么理解呢?2PC是为了解决在分布式服务中,保证事务的ACID的特性所提出的一致性算法。
1.1 2PC的过程?
2PC里面有协调者和参与者,主要涉及到的过程是询问阶段和提交阶段;
询问阶段,协调者发送信号到多个参与者执行业务操作,这个时候参与者实行全局阻塞,如果参与者准备好了的话,就会给协调者返回确认的信息,然后确认者在发送提交的信号;如果没有准备好,参与者就返回失败的信号,最后结束。
因为是多个参与者,如果其中有一个参与者返回的是失败的信号,都表示这个建立确认的过程是不成功的。
1.2 2PC的优缺点
2PC的优点就是简单,实现方便
2PC的缺点:
- 同步阻塞:不论是在准备阶段还是提交阶段,参与者的资源都是锁定状态的,协调者通知进行全局提交之后,参与者才会释放资源,对性能影响较大。
- 单点故障:如果协调者出现问题,那么整个第二阶段提交将无法运行,如果协调者是在第二阶段出现故障的话,那么其他的参与者将会处于缩影事务资源的状态。
- 数据不一致新:如果在第二阶段,协调者发送commit的执行的时候,由于网路的抖动导致只有部分参与者接收到信号的话,就会导致数据不一致的问题。
二、3PC
针对2PC的问题,提出了3PC,那么3PC的过程是什么?
3PC相对于2PC的话,增加了一个canCommit的过程,这个阶段不在处理业务,只是询问参与者是否准备好了, 如果都返回yes的话,才进行第二阶段preCommit,就是执行业务,然后参与者返回执行成功,进入到第三个阶段,就是doCommit的阶段。
三、TCC
TCC 是try、confirm、cancel的首字母缩写。
类似2PC是两个阶段,2PC主要是数据库来保证过程的完成,TCC的话就是在代码里面手动写入方法Try、Confirm、Cancel方法;大概得过程就是先让参与者先去试一下先写到数据库中,只不过这条数据的可见性为false,或者是将enable设置成false,如果没有问题,第二阶段就是将数据可见,设置成true,如果一阶段出错了的话,二阶段就执行删除的操作。
四、SAGA
五、消息一致性
使用MQ的半消息机制,就是生产者给mq发送一个半消息,这个时候消费者是不能消费的,这个时候mq给生产者发送一个预备消息确认,如果生产者确认成功,返回mq一个成功信号,这个时候消费者就可以消费mq里面的消息了。