首页 > 其他分享 >分布式事务方案 - SAGA模式

分布式事务方案 - SAGA模式

时间:2022-12-25 22:35:00浏览次数:38  
标签:事务 服务 SAGA 订单 事件 分布式

本文目的是讲清楚 SAGA 这种分布式事务解决方案的实现思路,不包括具体实现代码,具体实现推荐使用阿里的Seata 框架。

内容包括:

  • 分布式事务问题描述
  • SAGA - Choreography 策略
  • SAGA - Orchestration 策略

补充:

常用的分布式事务解决方案还包括TCC、 可靠消息模式 。

1. 分布式事务问题描述

 

比如说电商系统中,用户下单了,后端需要调用:

  • 订单服务,创建订单
  • 库存服务,改商品的库存
  • 物流服务,创建物流单,准备发货

在分布式的微服务架构中,每个服务都会有自己独立的数据库,那么,这个下单的动作就涉及到了向多个数据库中写入数据。

因为不是在同一个数据库中,所以就不能依赖数据库的事务机制了,但是在业务逻辑中,这几个写库操作就应该是一个事务。

比如订单服务、库存服务中都写入成功了,但物流系统出现异常了,那么订单服务、库存服务就应该进行回滚,来保证整体数据的一致性。

如何在跨数据库的情况下实现事务呢?这就是分布式事务问题。

SAGA 就是一种老牌的分布式事务解决方案,已经有20来年了,其实现方式主要有两种:

  • Choreography
  • Orchestrator

下面介绍一下各自的实现思路。

2. SAGA - Choreography 策略

 

Choreography 是编舞的意思,就是把舞者之间的动作配合都编排好。

对应到分布式事务,就可以把各个服务理解为舞者,SAGA 的 Choreography 策略就是要定义好先执行哪个服务,根据执行结果再触发哪些服务的执行。

 

如上图,整体分布式事务处理流程为:

  1. 订单服务写自己的业务数据,并在数据库中 记录 一下订单的整体 状态 ,比如记为 "已下单"。
  2. 订单服务发布【订单创建成功】事件,库存服务会监听此事件。
  3. 库存服务收到事件通知后,写自己的业务数据,然后发布【库存修改成功】事件。
  4. 订单服务会监听此事件,收到事件通知后,修改订单状态,比如 "待发货"。
  5. 物流服务也会监听此事件,收到事件通知后,写自己的业务数据,然后发布【物流处理成功】。
  6. 订单服务会监听此事件,收到通知后,修改订单状态,改为 "已发货"。

这样,通过事件机制,各个服务之间完成协同配合,实现了分布式事务。

下面看异常情况的处理,比如物流服务异常了,如下图。

 

重点看异常处理流程:

  1. 物流服务会发布事件【物流处理异常】。
  2. 订单服务、库存服务都监听此事件,所以会收到物流异常的通知。图中(8)、(9)。
  3. 订单服务执行自己的回滚逻辑。图中(10)。
  4. 库存服务执行自己的回滚逻辑。图中(11)。

这样就实现了分布式事务的异常处理。

SAGA Choreography 策略是通过【事件机制】实现的,各个服务都定义好正常、异常的处理方法,然后监听目标事件,根据不同的事件来调用不同的处理方法。

此策略好处是实现简单,坏处是整体事件逻辑会比较复杂,比如有10个服务参与其中,那么整体事件订阅关系就会很凌乱。

标签:事务,服务,SAGA,订单,事件,分布式
From: https://www.cnblogs.com/muxilaoshi/p/17004776.html

相关文章

  • .Net core 事务开启
      代码结构:usingvartran=_db.Database.BeginTransaction();try{业务逻辑代码tran.Commit();returnt......
  • Zookeeper分布式一致性算法--2PC、3PC及其应用
    2PC、3PC的基本概念2PC,3PC主要是基于分布式事务的分布式一致性算法(因为分布式事务也可能会导致数据的不一致问题,这跟副本的不一致性从大类上看是都归于数据的不一致)。在分......
  • 事务
    1.事务的基本介绍:    1.概念:      *如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败    2.操作:      1.开启事务......
  • 基于注解的声明式事务控制
    环境搭建1、导入依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><v......
  • 基于 XML 的声明式事务控制
    环境搭建1、导入依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><v......
  • 事务(Transaction)逻辑应用
    1.什么是事务?是一个逻辑工作单元,这个工作单元中的所有操作,要么都成功,要么都失败2.事务是如何保证数据的正确性的?通过事务的四大特性:原子性、一致性、隔离性、持久性原......
  • spring事务控制的 API
    1、PlatformTransactionManagerspring的事务管理器,它里面提供了我们常用的操作事务的方法PlatformTransactionManager接口提供事务操作的方法获取事务状态信息Transac......
  • Spring的隔离级别,Spring事务传播属性,Spring事务与数据库事务之间的联系
    一、Spring五大事务隔离级别Spring事务隔离级别比数据库事务隔离级别多一个default在进行配置的时候,如果数据库和spring代码中的隔离级别不同,那么以spring的配置为主。1)......
  • 详解MySQL事务(transaction),用图直观解释了MySQL脏读、不可重复读、幻读的问题
    事务事务是一组操作的集合,会把所有操作作为一个整体去执行,要么同时成功,要么同时失败。事务操作查看/设置事务提交方式SELECT@@autocommit;#1为自动,0为手动SET@@......
  • 聊聊spring事务失效的12种场景,太坑了
    前言对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么......