[微服务架构 ]Saga 模式| 如何使用微服务实现业务事务 第一部分

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: [微服务架构 ]Saga 模式| 如何使用微服务实现业务事务 第一部分

最强大的事务类型之一称为两阶段提交,当第一个事务的提交取决于第二个事务的完成时,它是摘要。特别是当您必须同时更新多个实体时,例如确认订单和立即更新库存时,它非常有用。

但是,例如,当您使用微服务时,事情变得更加复杂。每个服务都是一个独立的系统,拥有自己的数据库,您不再可以利用本地两阶段提交的简单性来维护整个系统的一致性。

当你失去这种能力时,RDBMS成为一个非常糟糕的存储选择,因为你可以完成相同的“单实体原子事务”,但只需使用像Couchbase这样的NoSQL数据库就可以快几十倍。这就是为什么大多数使用微服务的公司也在使用NoSQL。

要举例说明此问题,请考虑以下电子商务系统的高级微服务架构:


在上面的示例中,人们不能只在一个ACID交易中下订单,向客户收费,更新库存,并将其发送到交货。要始终如一地执行此整个流程,您将需要创建分布式事务。

我们都知道实现分布式任务是多么困难,不幸的是,交易也不例外。处理瞬态状态,服务,隔离和回滚之间的最终一致性是在设计阶段应该考虑的场景。

幸运的是,我们已经为它提出了一些好的模式,因为我们已经实施分布式事务已有二十多年了。我今天要谈的那个叫做Saga模式。

传奇(Saga)模式

分布式事务最着名的模式之一称为Saga。关于它的第一篇论文发表于1987年,从那时起它就成了一种流行的解决方案。

Saga是一系列本地事务,其中每个事务在单个服务中更新数据。第一个事务由对应于系统操作的外部请求启动,然后每个后续步骤由前一个完成触发。

使用我们之前的电子商务示例,在一个非常高级的设计中,Saga实现如下所示:


有几种不同的方法来实现传奇交易,但最受欢迎的两种方式是:

  1. 事件/Choreography(编舞):当没有中央协调时,每个服务产生并监听其他服务的事件,并决定是否应该采取行动。
  2. 命令 / Orchestration(编曲):协调器服务负责集中saga的决策和排序业务逻辑。

让我们更深入地了解每个实现,以了解它们的工作原理。

事件/编

事件/Choreography(编舞)方法中,第一个服务执行事务然后发布事件。该事件由一个或多个服务监听,这些服务执行本地事务并发布(或不发布)新事件。

当最后一个服务执行其本地事务并且不发布任何事件时,分布式事务结束,或者任何传奇(Saga)参与者都不会听到发布的事件。

让我们看看它在我们的电子商务示例中的样子:


  1. 订单服务保存新订单,将状态设置为挂起并发布名为ORDER_CREATED_EVENT的事件。
  2. 付款服务侦听ORDER_CREATED_EVENT,向客户收费并发布事件BILLED_ORDER_EVENT。
  3. Stock Service监听BILLED_ORDER_EVENT,更新库存,准备订单中购买的产品并发布ORDER_PREPARED_EVENT。
  4. Delivery Service侦听ORDER_PREPARED_EVENT,然后选择并交付产品。最后,它发布了ORDER_DELIVERED_EVENT
  5. 最后,Order Service侦听ORDER_DELIVERED_EVENT并将订单状态设置为已结束。

在上面的情况中,如果需要跟踪订单的状态,订单服务可以简单地监听所有事件并更新其状态。

分布式事务中的回滚

回滚分布式事务并非免费。通常,您必须实施另一个操作/事务来补偿之前已完成的操作。

假设Stock Service在交易期间失败了。让我们看看回滚会是什么样子:


  1. 库存服务生产PRODUCT_OUT_OF_STOCK_EVENT;
  2. 订单服务和付款服务都会收听上一条消息:
  • 付款服务退还客户。
  • 订单服务将订单状态设置为失败。

请注意,为每个事务定义一个公共共享ID至关重要,因此每当您抛出一个事件时,所有侦听器都可以立即知道它所引用的事务。

Saga 事件/Choreography(编舞)设计的好处和缺点

事件/编排是实现Saga模式的自然方式;它简单,易于理解,不需要太多的努力来构建,并且所有参与者都是松散耦合的,因为他们没有彼此的直接知识。如果您的交易涉及2到4个步骤,那么它可能非常合适。

但是,如果您不断在事务中添加额外的步骤,这种方法很快就会变得混乱,因为很难跟踪哪些服务监听哪些事件。此外,它还可能在服务之间添加循环依赖,因为它们必须订阅彼此的事件。

最后,使用这种设计实现测试会很棘手。为了模拟事务行为,您应该运行所有服务。

在下一篇文章中,我将解释如何使用另一个名为Command / Orchestration的Saga实现解决Saga事件/编舞方法的大部分问题。

相关文章
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
8月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
209 0
|
8月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1122 0
|
8月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
230 0
|
4月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
247 0
|
11月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
7月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
442 12
|
11月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
927 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
11月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
3172 36
微服务架构解析:跨越传统架构的技术革命

热门文章

最新文章