架构Spring Cloud 分布式事物

微服务架构:最终一致性 + 事务补偿

2018-09-01  本文已影响179人  魔镜的技术心经

分布式事务产生的原因

随着微服务架构的流行,让分布式事务问题日益突出, 那么常见的分布式事务解决方案有哪些呢? 如何理解最终一致性和它的事务补偿机制呢?

刚性事务 - 强一致性

image.png

如上图,这是个标准的全局事务,事务管理器控制着全局事务,管理事务的生命周期,并通过XA协议与资源管理器协调资源;资源管理器负责控制和管理实际的资源 (这里的资源管理器,可以是一个DBMS,或者消息服务管理系统)

两阶段提交

它是XA用于在全局事务中协调多个资源的机制,常用于事务管理器资源管理器之间,解决一致性问题,分两阶段:

image.png

2PC的问题

3PC的改进

增加了超时机制, 主要解决单点故障问题,并减少资源锁定时间,一旦RM无法及时收到来至TM的信息之后,它会默认执行Commit操作, 而不会一直持有事务资源并处于阻塞状态。但是这种机制同样会导致数据不一致的问题,由于网络的原因,TM发送的回滚动作,没有被RM及时的收到,那么RM等待超时后就执行了提交操作,这样就和收到回滚操作并执行的RM之间存在了数据不一致的情况。

柔性事务 - 最终一致性

在2008年,eBay公布了基于BASE准则的最终一致性解决方案,它主要采用了消息队列来辅助实现事务控制流程,其核心通过消息队列的方式来异步执行分布式处理的任务,如果事务失败,则可以发起人工重试的纠正流程(比如对账系统,对处于dead letter queue的问题进行处理)

消息发送一致性

微服务架构下,需要通过网络进行通信,就自然引入了数据传输的不确定性,也就是CAP原理中的P-分区容错,而这里的消息发送一致性是可靠消息的保证。

生成消息的业务动作与消息发送的一致(e.g: 如果业务操作成功,那么由这个业务操作所产生的消息一定会成功投递出去,否则就丢失消息)

最终一致性.png

如上图,保证消息发送一致性的一般流程如下:

消息的ACK确认流程中,任何一个环节都可能会出问题!

未ACK的消息,采用按规则重新投递的方式进行处理(很多MQ都提供at least once的投递,持久化和重试机制),一般还会设置重发的次数, 超过次数的消息会进入dead letter queue,等待人工干预或者延后定时处理。

业务接口的幂等性

消息的重复发送会导致业务接口出现重复调用的问题,主要原因就是消息没有及时收到ACK确认导致的, 那如何实现幂等性设计呢?

在实际的业务场景中, 业务接口的幂等性设计,常结合查询操作一起使用,

比如根据唯一标识查询消息是否被处理过, 或者根据消费日志表,来维护消息消费的记录。

保证最终一致性的模式

上一篇 下一篇

猜你喜欢

热点阅读