首页 > 其他分享 >SAGA分布式

SAGA分布式

时间:2023-10-16 19:22:18浏览次数:34  
标签:事务 服务 SAGA 监听 订单 OSO EVENT 分布式

Saga是由一系列的本地事务构成。每一个本地事务在更新完数据库之后,会发布一条消息或者一个事件来触发Saga中的下一个本地事务的执行。如果一个本地事务因为某些业务规则无法满足而失败,Saga会执行在这个失败的事务之前成功提交的所有事务的补偿操作。

Saga的实现有很多种方式,其中最流行的两种方式是:

  • 基于事件的方式。这种方式没有协调中心,整个模式的工作方式就像舞蹈一样,各个舞蹈演员按照预先编排的动作和走位各自表演,最终形成一只舞蹈。处于当前Saga下的各个服务,会产生某类事件,或者监听其它服务产生的事件并决定是否需要针对监听到的事件做出响应。
  • 基于命令的方式。这种方式的工作形式就像一只乐队,由一个指挥家(协调中心)来协调大家的工作。协调中心来告诉Saga的参与方应该执行哪一个本地事务。

1,基于事件的方式

在基于事件的方式中,第一个服务执行完本地事务之后,会产生一个事件。其它服务会监听这个事件,触发该服务本地事务的执行,并产生新的事件。

我们继续以订单流程为例,说明一下该模式。

假设一个完整的订单流程包含了如下几个服务:

  • Order Service:订单服务
  • Payment Service:支付服务
  • Stock Service:库存服务
  • Delivery Service:物流服务
  1. 订单服务创建一笔新订单,将订单状态设置为"待处理",产生事件ORDER_CREATED_EVENT。
  2. 支付服务监听ORDER_CREATED_EVENT,完成扣款并产生事件BILLED_ORDER_EVENT。
  3. 库存服务监听BILLED_ORDER_EVENT,完成库存扣减和备货,产生事件ORDER_PREPARED_EVENT。
  4. 物流服务监听ORDER_PREPARED_EVENT,完成商品配送,产生事件ORDER_DELIVERED_EVENT。
  5. 订单服务监听ORDER_DELIVERED_EVENT,将订单状态更新为"完成"。

在这个流程中,订单服务很可能还会监听BILLED_ORDER_EVENT,ORDER_PREPARED_EVENT来完成订单状态的实时更新。将订单状态分别更新为"已经支付"和"已经出库"等状态来及时反映订单的最新状态。

该模式下分布式事务的回滚

为了在异常情况下回滚整个分布式事务,我们需要为相关服务提供补偿操作接口。

  1. 库存服务产生事件PRODUCT_OUT_OF_STOCK_EVENT。
  2. 订单服务和支付服务都会监听该事件并做出响应:

l 支付服务完成退款。

l 订单服务将订单状态设置为"失败"。

基于事件方式的优缺点

优点:简单且容易理解。各参与方相互之间无直接沟通,完全解耦。这种方式比较适合整个分布式事务只有2-4个步骤的情形。

缺点:这种方式如果涉及比较多的业务参与方,则比较容易失控。各业务参与方可随意监听对方的消息,以至于最后没人知道到底有哪些系统在监听哪些消息。更悲催的是,这个模式还可能产生环形监听,也就是两个业务方相互监听对方所产生的事件。

接下来,我们将介绍如何使用命令的方式来克服上面提到的缺点。

基于事件驱动架构的更多讨论,可以参考笔者的另外一篇文章:事件驱动架构event driven的多种含义 by Martin Fowler

2,基于命令的方式

在基于命令的方式中,我们会定义一个新的服务,这个服务扮演的角色就和一支交响乐乐队的指挥一样,告诉各个业务参与方,在什么时候做什么事情。我们管这个新服务叫做协调中心。协调中心通过命令/回复的方式来和Saga中其它服务进行交互。

  1. 订单服务创建一笔新订单,将订单状态设置为"待处理",然后让Order Saga Orchestrator(OSO)开启创建订单事务。
  2. OSO发送一个"支付命令"给支付服务,支付服务完成扣款并回复"支付完成"消息。
  3. OSO发送一个"备货命令"给库存服务,库存服务完成库存扣减和备货,并回复"出库"消息。
  4. OSO发送一个"配送命令"给物流服务,物流服务完成配送,并回复"配送完成"消息。
  5. OSO向订单服务发送"订单结束命令"给订单服务,订单服务将订单状态设置为"完成"。

OSO清楚一个订单处理Saga的具体流程,并在出现异常时向相关服务发送补偿命令来回滚整个分布式事务。

实现协调中心的一个比较好的方式是使用状态机(Sate Machine)。

  1. 库存服务回复OSO一个"库存不足"消息。
  2. OSO意识到该分布式事务失败了,触发回滚流程:

OSO发送"退款命令"给支付服务,支付服务完成退款并回复"退款成功"消息。

OSO向订单服务发送"将订单状态改为失败命令",订单服务将订单状态更新为"失败"。

基于命令方式的优缺点

优点:

  1. 避免了业务方之间的环形依赖。
  2. 将分布式事务的管理交由协调中心管理,协调中心对整个逻辑非常清楚。
  3. 减少了业务参与方的复杂度。这些业务参与方不再需要监听不同的消息,只是需要响应命令并回复消息。
  4. 测试更容易(分布式事务逻辑存在于协调中心,而不是分散在各业务方)。
  5. 回滚也更容易。

缺点:

一个可能的缺点就是需要维护协调中心,而这个协调中心并不属于任何业务方。

Saga模式小窍门

1,给每一个分布式事务创建一个唯一的Tx id。这个唯一的Tx id可以用来在各个业务参与方沟通时精确定位哪一笔分布式事务。

2,对于基于命令的方式,在命令中携带回复地址。这种方式可以让服务同时响应多个协调中心请求。

3,幂等性。幂等性能够增加系统的容错性,让各个业务参与方服务提供幂等性操作,能够在遇到异常情况下进行重试。

4,尽量在命令或者消息中携带下游处理需要的业务数据,避免下游处理时需要调用消息产生方接口获取更多数据。减少系统之间的相互依赖。

标签:事务,服务,SAGA,监听,订单,OSO,EVENT,分布式
From: https://www.cnblogs.com/yhcTACK/p/17768162.html

相关文章

  • 分布式一致性算法Raft
    raft算法之所以容易理解,其一是他将一致性问题划分成几个子问题,这几个子问题都是独立、可理解和解释的。从传统的思维来讲,对于一个复杂的系统或者工程,都是大化小,分解实现,然后去尝试融合解决整体逻辑。一、Raft详解Raft算法是分布式系统开发首选的共识算法。比如现在流行Etcd、Con......
  • 【分布式】解决树莓派4B-64位更换清华源问题(GPG error:because the public key is no
    【分布式】解决树莓派4B-64位更换清华源问题(GPGerror:becausethepublickeyisnotavailable)别出BUG求求了于2022-04-3016:15:38发布阅读量3.1k收藏18点赞数7分类专栏:分布式文章标签:debianbash树莓派清华源publickey版权分布式专栏收录该内容18篇文章1......
  • 分布式一致性协议 之 Paxos协议
    1、什么是Paxos       Paxos协议其实说的就是Paxos算法,Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。       Paxos由莱斯利·兰伯特(LeslieLamport)于1998年在《ThePart-TimeParliament》论文......
  • 分布式操作系统市场规模超万亿,这事你怎么看?
    昨晚参加一个饭局,席间和一位做ICT投资的朋友聊起我们团队研发的分布式操作系统,请他分析一下分布式操作系统和连带的产业市场规模价值,我给他的依据是:分布式操作系统属于多机操作系统(windowslinux是单机系统),解决了大规模硬件资源和算力的聚合输出问题。打个比方,单机操作系统是一个人......
  • Kafka:用于日志处理的分布式消息系统
    周末躺不平,摆不烂,卷不动,随便读一篇paper吧原文:Kafka:aDistributedMessagingSystemforLogProcessing作者:JayKreps/NehaNarkhede/JunRao这三尊神就是当初在LinkedIn开发Kafka的大佬摘要日志处理已经成为了当下互联网公司数据管道(datapipeline)的重要组成部分。......
  • Redis分布式锁实现一直到Redis相关操作总结
    FreeRedis实现源码///<summary>///开启分布式锁,若超时返回null///</summary>///<paramname="name">锁名称</param>///<paramname="timeoutSeconds">超时(秒)</param>///<paramname="autoDelay">自动延长锁超时时......
  • Hadoop2伪分布式安装、分布式安装
    最近有观看我主讲的《Hadoop基础与演练》课程的同学问到Hadoop环境到底应该怎么安装。Hadoop的安装其实非常的简单,网上有很多教程,官网也有示例。但是可能部分同学对于linux不太熟悉,导致安装的时候会遇到各种问题,打击学习激情。本文就来详细的讲解一下如何配置Hadoop2的伪分布式环......
  • 分布式场景
    一、分布式文件系统常用的分布式文件系统:HDFS(HadoopDistributedFileSystem)HDFS是ApacheHadoop生态系统中的分布式文件系统,用于存储和管理大规模数据集。它是为了支持大数据处理和分析而设计的,具有高容错性、高可靠性和高可扩展性的特点。它采用了主从架构,由一个......
  • 面试官:Redis 分布式锁如何自动续期
    1、Redis实现分布式锁指定一个key作为锁标记,存入Redis中,指定一个唯一的用户标识作为value。当key不存在时才能设置值,确保同一时间只有一个客户端进程获得锁,满足互斥性特性。设置一个过期时间,防止因系统异常导致没能删除这个key,满足防死锁特性。当处理完业务之后需要清除......
  • 基于 MySQL 和 DynamoDB 的强一致性分布式事务实践
    在单体应用向微服务架构转型的过程中,本地事务已不再满足系统一致性需求,为了解决这一问题,前人在对性能和数据一致性反复权衡的过程中总结了许多典型的协议和算法,各有优劣。本文我们将深入探讨Freewheel如何实现无单点故障的可扩展分布式事务实现模型。1、为什么需要分布式事务?当应......