一致性(C):
在分布式系统中的所有数据备份,「在同一时刻是否拥有同样的值」。(等同于所有节点访问同一份最新的数据副本)
可用性(A):
在集群中一部分节点「故障」后,集群整体「是否还能响应」客户端的读写请求。(对数据更新具备高可用性)
分区容错性(P):
即使出现「单个组件无法可用,操作依然可以完成」。
熟悉mysql的同学对两阶段提交应该颇为熟悉,mysql的事务就是通过「日志系统」来完成两阶段提交的。
两阶段协议可以用于单机集中式系统,由事务管理器协调多个资源管理器;也可以用于分布式系统,「由一个全局的事务管理器协调各个子系统的局部事务管理器完成两阶段提交」。
这个协议有「两个角色」,
A节点是事务的协调者,B和C是事务的参与者。
事务的提交分成两个阶段
第一个阶段是「投票阶段」
第二个阶段是「决定阶段」
当A节点收到B和C参与者所有的确认消息后
「单点故障」:一旦事务管理器出现故障,整个系统不可用
「数据不一致」:在阶段二,如果事务管理器只发送了部分 commit 消息,此时网络发生异常,那么只有部分参与者接收到 commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。
「响应时间较长」:整个消息链路是串行的,要等待响应结果,不适合高并发的场景
「不确定性」:当事务管理器发送 commit 之后,并且此时只有一个参与者收到了 commit,那么当该参与者与事务管理器同时宕机之后,重新选举的事务管理器无法确定该条消息是否提交成功。
三阶段提交又称3PC,相对于2PC来说增加了CanCommit阶段和超时机制。如果一段时间内没有收到协调者的commit请求,那么就会自动进行commit,解决了2PC单点故障的问题。
第一阶段:「CanCommit阶段」这个阶段所做的事很简单,就是协调者询问事务参与者,你是否有能力完成此次事务。
TCC其实就是采用的补偿机制,其核心思想是:「针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作」
执行流程:
消息生产方,需要额外建一个消息表,并「记录消息发送状态」。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。
消息消费方,需要「处理」这个「消息」,并完成自己的业务逻辑。
生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。
消息事务的原理是将两个事务「通过消息中间件进行异步解耦」,和上述的本地消息表有点类似,但是是通过消息中间件的机制去做的,其本质就是‘将本地消息表封装到了消息中间件中‘。
执行流程:
执行流程:
其核心思想是「将长事务拆分为多个本地短事务」,由Saga事务协调器协调,如果正常结束那就正常完成,如果「某个步骤失败,则根据相反顺序一次调用补偿操作」。
原文:https://www.cnblogs.com/KL2016/p/15185220.html