当前位置:首页 > 文章列表 > 文章 > java教程 > 跨多个服务的事务操作是一种疯狂的方法

跨多个服务的事务操作是一种疯狂的方法

来源:dev.to 2024-11-12 14:37:09 0浏览 收藏
推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

一分耕耘,一分收获!既然打开了这篇文章《跨多个服务的事务操作是一种疯狂的方法》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

跨多个服务的事务操作是一种疯狂的方法

团队在微服务环境中必须处理的众多复杂问题之一就是事务。跨越多个微服务的事务。与单体应用程序不同,单体应用程序的事务通常使用单个数据库和 @transactional
进行管理 注解,在微服务中,每个服务往往都有自己的数据库,使得分布式事务变得更加复杂。这是有关如何在 spring boot 中有效处理这些分布式事务的指南。

首先,让我们先就什么是交易达成一致。

事务是计算或数据库环境中的一个工作单元,被视为单个不可分割的操作。它代表一系列必须一起成功或一起失败的操作或步骤,即使在发生意外事件(例如断电或网络故障)时也能确保数据的一致性和完整性

在数据库上下文中,事务可能涉及多个查询,例如创建、更新或删除记录。交易通常遵循四个基本属性,称为 acid 属性:

a. 原子性 - 事务中的所有操作都被视为单个单元。要么所有操作成功,要么全部失败。

b. 一致性 - 事务将系统从一种有效状态转移到另一种有效状态,从而保持数据有效性。

c. 隔离 - 事务是隔离执行的,这意味着中间状态对其他事务不可见。

d. 持久性 - 事务一旦提交,其更改就是永久性的,并且在系统崩溃时也能幸存。


一个短篇故事

在一个繁忙的电子商务应用程序中,想象一下客户 alice 订购了一台新笔记本电脑、一个配件和快递。以下是她的订单如何在由 ordersagaorchestrator 管理的系统中流动的幕后故事。

在一个繁忙的电子商务应用程序中,想象一下客户 alice 订购了一台新笔记本电脑、一个配件和快递。以下是她的订单如何在由 ordersagaorchestrator 管理的系统中流动的幕后故事。

alice 输入付款和送货信息后点击“立即订购”。此操作启动了一个称为传奇的流程,这是一系列精心策划的交易,以确保她的订单从头到尾得到正确处理。

第 1 步:付款处理
saga 编排器首先检查 paymentservice,发起调用以从 alice 的帐户中扣除所需的金额。调用 paymentservice.processpayment() 方法,授权 alice 付款。

第2步:库存预订
一旦付款成功,协调器就会转移到 inventoryservice,在那里为 alice 保留特定的笔记本电脑型号和配件。此预订步骤至关重要,以便在订单仍在处理期间,库存不会售完或交给其他客户。

第 3 步:发货启动
成功预订库存后,saga 协调器将联系 shippingservice。在这里,shippingservice.initiateshipping() 启动物流,确保物品包装好并准备好运送到 alice 的地址。

处理失败:补偿逻辑

但是在分布式环境中,任何一步都可能出错。如果由于物流错误导致发货启动失败,或者由于库存差异而实际上无法履行库存怎么办?协调器已准备好补偿策略。

如果抛出异常,协调器将启动补偿事务以回滚整个过程,因此 alice 不会为她不会收到的物品付费:

3.1。取消发货 - 协调器调用shippingservice.cancelshipping(),停止发货。

3.2。释放库存 - 然后触发 inventoryservice.releaseinventory(),释放 alice 的保留物品,以便其他客户可以购买它们。

3.3。退款 - 最后,它调用 paymentservice.refund() 来退还 alice 的付款,确保她不会为订单付费。

最后,这个精心策划的传奇确保了 alice 的体验流畅且一致,如果出现任何问题,都会以维护系统完整性的方式解决。这就是微服务中分布式事务和补偿逻辑的魔力。


现在我们知道了什么是事务并了解了事务可能有用的现实场景,让我们深入研究如何在分布式环境中实现此功能。

团队可以使用一些关键方法来解决这个问题

1。 saga 模式: saga 模式是微服务架构中处理分布式事务最广泛使用的模式之一。传奇是每个服务独立执行的本地事务序列。 saga 中的每一步都会通过一个操作来补偿,如果 saga 失败,该操作会撤消该步骤。

saga 模式可以通过两种主要方式实现:

  1. a。 基于编排的 saga: 事务中涉及的每个服务都会侦听事件并执行其事务。完成后,它会发出一个事件来触发传奇中的下一步。如果某个步骤失败,则会触发补偿事件以撤消之前的步骤。

  2. b。 基于编排的 saga: 集中式服务(saga 编排器)协调 saga 的步骤。它确定操作顺序并管理发生故障时的补偿。

2。两阶段提交(2pc): 虽然两阶段提交协议通常用于单体系统,但它可以通过 atomikos 或 bitronix 等分布式事务管理器跨分布式系统使用。但是,我不推荐这种方法,因为它在微服务上下文中存在一些限制,因为它会导致高延迟并且容错能力较差。如果我是你,我通常会避免这种方法,而选择 saga 模式。

3。事件驱动架构: 使用事件驱动方法,服务通过事件进行通信,特别适合处理分布式事务。这种方法与 saga 模式非常吻合。每个服务独立执行其事务,然后发出一个事件以通知其他服务有关结果。这些事件可以使用 apache kafka、rabbitmq 或其他消息代理来处理。

现在,让我们看看它在代码中是如何工作的。

saga 模式有多种风格,但在本文中,我将尝试在 spring boot 中实现基于编排的 saga 模式:

第 1 步: 定义 saga orchestrator:
在这里,我将创建一个简单的服务来充当协调器,负责协调事务。

该服务将定义传奇的流程,以正确的顺序调用每个服务,并在需要时处理补偿事务。

@service
public class ordersagaorchestrator {

    @autowired
    private paymentservice paymentservice;

    @autowired
    private inventoryservice inventoryservice;

    @autowired
    private shippingservice shippingservice;

    public void createordersaga(order order) {
        try {
            paymentservice.processpayment(order.getpaymentdetails());
            inventoryservice.reserveinventory(order.getitems());
            shippingservice.initiateshipping(order.getshippingdetails());
        } catch (exception e) {
            // compensation logic
            shippingservice.cancelshipping(order.getshippingid());
            inventoryservice.releaseinventory(order.getitems());
            paymentservice.refund(order.getpaymentid());
        }
    }
}

第 2 步: 在每个服务中创建本地事务和补偿方法:

每个服务都应该有自己的事务来完成其在传奇中的步骤,并在需要时使用另一个事务来补偿它。这是大概的结构。

@service
public class paymentservice {

    @transactional
    public void processpayment(paymentdetails details) {
        // perform payment logic
    }

    @transactional
    public void refund(string paymentid) {
        // perform refund logic
    }
}

第 3 步: 基于事件的通信(可选,用于编排):每个服务都可以发出事件来通知其他人交易的结果。

public class paymentservice {

    private final applicationeventpublisher eventpublisher;

    public paymentservice(applicationeventpublisher eventpublisher) {
        this.eventpublisher = eventpublisher;
    }

    public void processpayment(paymentdetails details) {
        // process payment
        eventpublisher.publishevent(new paymentprocessedevent(this, details));
    }
}

第 4 步: 采取措施保证数据一致性:使用幂等性检查来确保 saga 中的每个步骤仅执行一次。这在分布式系统中很重要,因为网络故障或重试可能会导致重复请求。

第 5 步: 使用消息代理来提高可靠性:如果您使用事件来管理传奇,可以使用像 rabbitmq 的 kafka 这样的消息代理持久性,并且可以在服务暂时不可用时缓冲事件。

第 6 步: 错误处理和重试: 将错误处理和重试逻辑合并到您的协调器和各个服务中以处理临时故障。 spring retry 在这里很有用,因为它可以在可配置策略中自动重试失败的操作。

@Retryable(value = {RemoteServiceException.class}, maxAttempts = 3, backoff = @Backoff(delay = 2000))
public void reserveInventory(List<Item> items) {
    // Attempt to reserve inventory
}

结论

微服务中的分布式事务具有挑战性,但通过使用 saga(尤其是编排)和事件驱动通信等模式,您可以实现可靠且可扩展的解决方案。

spring boot 通过提供对事务管理、事件发布以及与消息代理集成的支持,使这一切变得更容易。

最后,这个精心策划的传奇确保了 alice 的体验流畅且一致,如果出现任何问题,都会以维护系统完整性的方式解决。这就是微服务中分布式事务和补偿逻辑的魔力。

本篇关于《跨多个服务的事务操作是一种疯狂的方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
Vue.js 中 v-html 指令如何处理特殊字符? 
Vue.js 中 v-html 指令如何处理特殊字符?
上一篇
Vue.js 中 v-html 指令如何处理特殊字符?
为什么内联元素中文字可以撑起高度,而图片却不能?
下一篇
为什么内联元素中文字可以撑起高度,而图片却不能?
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3207次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3421次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3450次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4558次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3828次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码