「转载」分布式事务方案 - SAGA模式

吃苹果的上帝 2020-11-12 10:29:49 ⋅ 625 阅读

性能与架构:杜亦舒
原文:https://mp.weixin.qq.com/s/An6QbAOw6jhWxg7GDT56Ug

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

内容包括:

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

补充:

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

1. 分布式事务问题描述

「转载」分布式事务方案 - SAGA模式

 

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

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

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

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

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

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

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

  • Choreography
  • Orchestrator

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

2. SAGA - Choreography 策略

「转载」分布式事务方案 - SAGA模式

 

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

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

「转载」分布式事务方案 - SAGA模式

 

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

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

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

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

「转载」分布式事务方案 - SAGA模式

 

重点看异常处理流程:

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

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

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

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

3. SAGA - Orchestration

「转载」分布式事务方案 - SAGA模式

 

Orchestration 是乐队编排的意思。

对应到分布式事务,各个服务就是乐队中的各个演奏者,还需要一个【总指挥】,所以在 SAGA - Orchestration 策略中会单独创建一个此角色。

![image-20201111184654838](/Users/a/Library/Application Support/typora-user-images/image-20201111184654838.png)

如上图,正常处理流程:

  1. 订单服务写自己的业务数据
  2. 订单服务向总指挥报告自己完成了
  3. 总指挥向库存服务发送执行指令
  4. 库存服务写数据
  5. 库存服务报告自己完成了
  6. 总指挥向订单服务发送指令
  7. 订单服务更新订单状态
  8. 总指挥向物流服务发送指令

......

后面的就不细说,都是一个思路。

异常处理的思路也是一样的,还是假设物流服务异常了,那么它会向总指挥报告,总指挥就会向订单服务、库存服务发送回滚的指令。

所以 Orchestration 策略的重点在于总指挥,需要为其定义指挥手册,以便总指挥在不同的时刻向相应的服务发送对应的指令。

这个总指挥实际上是通过【状态机】来实现的。

此策略好处是服务之间没有关联了,整体结构清晰。坏处是都了一个总指挥的角色,增加了复杂度。

4. 小结

Choreography 策略是通过事件机制实现的,每个服务都监听自己所关心的事件,每个服务执行后会发送相应的事件,监听此事件的服务执行相应的处理逻辑。

Orchestration 是通过状态机来实现的整体控制,定义还整体的处理流程,不同状态下需要触发的动作。

目前 Orchestration 是主流的策略,阿里的 Seata 分布式事务框架中实现了此策略,有兴趣可以去了解下。

Happy Learning ヾ( ̄▽ ̄)Bye~Bye~


全部评论: 0

    我有话说:

    BeetlSQL 3.0.10 发布,内置 sega 事务支持

    本次发布主要增加了分布式Sega事务支持,适合多数据源 按照社区建议,修改了了springboot 的 yml配置方式 修改了@Jackson和@UpdateTime,本来是用来作为例子,但社区

    高并发下分布式事务的解决方案-MQ消息事务+最终一致性

    分布式事务分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上

    BeetlSQL 3.1.0 发布,Spring Saga 事务支持

    ,可以使用Saga非常简单和方便的管理微服务事务。同...

    「轻阅读」分布式事务的四种解决方案,成长需要尝试

    分布式事务事务的操作位于不同的节点上,需要保证事务的 AICD 特性。

    「轻阅读」聊一聊6种常用的架构设计模式(上)

      许多现代应用都需要在企业级规模上进行构建,有时甚至需要在互联网规模上进行构建。这些应用都需要满足可扩展性、可用性、安全性、可靠性和弹性需求。 在本文中,我将谈论一些设计模式,这些模式

    RocketMQ 分布式事务

    分布式事务先回顾一下事务,例如银行转账,A给B转100元,这个动作包括2个步骤:A账户减100元B账户加100......

    Java并发解决方案分布式应用限流实践

    任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也讲到过,但是那是基于单机场景来写。 之前文章:接口限流算法:漏桶算法&令牌桶算法 然而再牛逼的机器,再优化的设计,对于特殊场景我...

    精品推荐:如何实现一个TCC分布式事务框架的一点思考

    本文将以Spring容器为例,试图分析一下,实现一个通用的TCC分布式事务框架需要注意的一些问题。

    「轻阅读」移动端事件穿透的原理与解决方案

    本文将带你了解事件穿透及如何在实际项目中选择合适的方案解决事件穿透问题。

    Apache Traffic Control 5.1.2 发布,高可扩分布式 CDN 解决方案

    Apache Traffic Control 5.1.2 现已发布。Apache Traffic Control 是一个分布式、可扩展的冗余解决方案,实现了现代 CDN 的所有核心功能,可

    构建 Netflix 分布式追踪(tracing)体系

    Maulik Pandeyhttps://mp.weixin.qq.com/s/NmGYfoJ7pw8CfRfUkc6o2Q “为什么我的手机不能播放 Tiger King?” — 一位 Twitter 网友留言 这是 Netflix ...

    转载」微服务分布式架构中,如何实现日志链路跟踪?

    背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用ELK来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,我们来看下面的图     上图

    Martian框架发布 3.0.3 版本,Redis分布式

    项目简介 Martian 是一个声明式 API 编程(DAP)框架,可以帮助你快速开发后端服务。 以HttpServer作为 http服务,彻底脱离Tomcat这一类的Web容器和Servlet,同时也让项目减少了几个依赖 声明式API,让Co...

    「轻阅读」亿级用户的分布式数据存储解决方案

    分布式数据库和分布式存储是分布式系统中难度最大、挑战最大,也是最容易出问题的地方。互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入。

    9种分布式ID生成方式,涨知识!

    https://www.toutiao.com/i6796536545537950211 一、为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID

    Dgraph 1.2.8 发布,事务性分布式图形数据库

    Dgraph 1.2.8 发布了。Dgraph 是一个可扩展的,分布式的,低延迟的图数据库,目标是提供 Google 生产水平的规模和吞吐量,在超过 TB 的结构数据里,为用户提供足够低延迟的实时

    分布式 NewSQL 数据库TiDB 3.1.0 版本发布,修复多项问题

    TiDB 是一款定位于在线事务处理/在线分析处理的融合型数据库产品,实现了一键水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。