high-concurrent-actual
  • Introduction
  • 分布式锁实现方案
    • 分布式锁介绍
    • 基于redis(一)
    • 基于redis(二)
    • 基于zookeeper
    • 分布式锁的应用场景
    • 分布式锁方案比较
  • 分布式事务解决方案
    • LCN解决分布式事务
    • 分布式相关的解决方案介绍
    • 消息队列解决方案
    • TCC解决方案
    • 本地消息表解决方案
    • SpringBoot实现分布式事务
    • SpringCloudAlibaba - 阿里分布式事务Seata
    • SpringCloudAlibaba - 阿里RocketMQ
    • RabbitMQ消息队列的分布式事务解决方案
  • 分布式系统校验解决方案
    • 分布式Session
    • JWT方式
    • 单点登录框架
  • 互联网高可用架构分析
  • 分布式订单流水号生成策略
Powered by GitBook
On this page

Was this helpful?

  1. 分布式事务解决方案

本地消息表解决方案

PreviousTCC解决方案NextSpringBoot实现分布式事务

Last updated 5 years ago

Was this helpful?

方案一

本地消息表这种实现方式应该是业界使用最多的,其核心思想是将分布式事务拆分成本地事务进行处理,这种思路是来源于ebay。我们可以从下面的流程图中看出其中的一些细节:

基本思路就是:

消息生产方,需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。如果消息发送失败,会进行重试发送。

消息消费方,需要处理这个消息,并完成自己的业务逻辑。此时如果本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。

生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。如果有靠谱的自动对账补账逻辑,这种方案还是非常实用的。

这种方案遵循BASE理论,采用的是最终一致性,笔者认为是这几种方案里面比较适合实际业务场景的,即不会出现像2PC那样复杂的实现(当调用链很长的时候,2PC的可用性是非常低的),也不会像TCC那样可能出现确认或者回滚不了的情况。

优点:一种非常经典的实现,避免了分布式事务,实现了最终一致性。在 .NET中 有现成的解决方案。

缺点:消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。