精选文章 分布式事务的一种解决方案

分布式事务的一种解决方案

作者:达济 时间: 2019-11-04 11:29:40
达济 2019-11-04 11:29:40

一.分布式事务的业务场景

现在好多项目都是拆分成多个模块进行开发的,由于一些业务的原因,各个模块有着或多或少的关联.比如在一个电商项目中,订单模块与配送模块之间,生成一个订单就要通知到配送模块进行安排物流配送.而订单模块与配送模块各是一个单独的工程,他们之间通过http调用接口进行通讯.在这个业务场景下,生成订单的过程与安排物流进行配送的过程按道理来说是应在一个事务中的,要成功都成功,要失败都失败.显然,这种事务不像在一个数据库中那样用一个注解就可以搞定.跨项目中的事务,就叫做分布式事务.

二.分布式事务该如何解决

之前面试时经常会被问到,分布式事务该如何解决?总是支支吾吾,答不上来,因为自己没有一个清晰的思路,知识储备不够.最近通过学习,知道了分布式事务可以通过消息中间件来解决,今天我们就以rabbitmq为例来实现一个分布式事务异步解决方案.由于时间有限,在这里我就不贴代码了,只具体说明下思路.

三.使用rabbitmq实现分布式事务

 1.两个项目之间进行通讯,我们以消息的形式进行传送.还拿电商的项目举例,订单端和配送端.订单端生成订单后要把消息发送到rabbitmq中的queue里面,这里就要确保一定发送成功.如何确保呢?我们在本地要建一张消息发送记录表,里面有发送的状态,发送的内容,发送时间字段.rabbitmq有一个消息发布确认机制,我们要配置开启,这样在订单端消息发布成功后,会有一个更新本地消息表里的发布状态.如果由于网络的原因消息发布确认没有成功,这时候要用一个定时器定时去重发本地消息表没有发送成功超时的消息.

2.在配送端也就是消息消费端接收到消息并处理成功后要手动Ack,告诉rabbitmq消息消费成功可以删除了.如果在消费的过程中捕获到异常了,这时消费端要nack然后通知rabbmit重新发送消息,在这里要记录好nack的次数也就是重试次数,如果重试超过一定次数则不再重新发送,可以将此消息放在一个队列或者数据库里,然后人工干预.

3.在配送端消息消费的过程中一定要做好幂等性,可以把消费记录存放在redis中,如果消息消费过了就不再重新消费.

 这种分布式事务解决方案可以解决大部分业务场景,但对于实时性要求较高的业务场景就不适合.分布式事务的解决方案还有很多种,还需要我们不断的去学习.

 

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:TWS耳机供应链,看看背后都有谁?

下一篇:颜色值转化rgba

您可能感兴趣

  • 不停机还能替换代码?6年的 Java程序员表示不可思议

    相信很多人都有这样一种感受,自己写的代码在开发、测试环境跑的稳得一笔,可一到线上就抽风,不是缺这个就是少那个反正就是一顿报错,而线上调试代码又很麻烦,让人头疼得很。不过, 阿里巴巴出了一款名叫Arthas的工具,可以在线分析诊断Java代码,让人眼前一亮。 ❞ Arthas 是什么? Arthas(阿尔萨斯) 是阿里开源的一个Java在线分析诊断工具。 Arthas 能解决啥问题? 在日常开...

  • IntellIJ IDEA2020新功能

    一、java 1、Java 14支持:记录和模式匹配 IntelliJ IDEA 2020.1添加了对Java 14及其新功能的支持。IDE不仅添加了对Records的完整代码洞察支持,而且还使您能够快速创建新记录并生成其构造函数和组件,并警告存在的错误。您还将发现对instanceof运算符的模式匹配的支持,包括新的检查和快速修复,该快速修复通过用新的简洁模式变量替换它们来快速简化冗长的i...

  • 二本学历,五年抄代码经验,疫情期被裁,三个月25K入职字节跳动

    前言 我的个人背景非常简单,也可以说丝毫没有亮点。 学历普通,计算机专业二本毕业,毕业后出来就一直在一家小公司,岁月如梭细,算了下至今从事Java开发已经5年了,也crud了五年,每天就是抄代码,毫无新意,甚至一度的怀疑人生。 其实很久之前就已经对自己不满了,每次都在想鼓起勇气想去打破困境,去改变自己,然而因为游戏因为玩耍一次又一次的破功;直到这次疫情,强有力的给了我当头一棒。是的,我失业了...

  • CRM管理策略为什么能增加企业利润?

    CRM(客户关系管理)是一种管理策略,它的核心在于企业用来管理它们与现有客户和潜在客户之间互动的所有活动、策略与技术,让你的客户在不同阶段的客户生命周期都有最佳体验。在很多企业内,我们都能听到“顾客至上”这句话,如果制定有效的CRM管理策略,带给客户良好的体验,可以帮助企业实现利润的增长。 为什么CRM管理策略能增加企业利润? 无论在哪个行业,客户忠诚度都是非常重要,CRM帮助企业与客户建立...

  • 前端路 - Webpack

    概述 本质 JavaScript 应用程序的静态模块打包器 核心 加载器(Loader)机制 工作流程 配置初始化 webpack 会首先读取配置文件,执行默认配置 编译前准备 webpack 会实例化 compiler,注册 plugins、resolverFactory、hooks。 reslove 前准备 webpack 实例化 compilation、NormalModuleFact...

  • Java异常面试题(2020最新版)

    文章目录 Java异常架构与异常关键字 Java异常简介 Java异常架构 1. Throwable 2. Error(错误) 3. Exception(异常) 运行时异常 编译时异常 4. 受检异常与非受检异常 受检异常 非受检异常 Java异常关键字 Java异常处理 声明异常 抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 直接抛出异常 封装异常再抛出 捕获异常 自定义异常 t...

  • html5语义化结构元素_语义HTML5在文档结构中的秘密

    html5语义化结构元素 Look at the graph given above, and you can quickly see how extensively HTML 5 is growing popularity. The Semantic HTML 5 has almost replaced the HTML. Now, we are going to discuss Sema...

  • Webview.apk —— Google 官方的私有插件化方案

    简介: 在 Android 跨入 5.0 版本之后,我们在使用 Android 手机的过程中,可能会发现一个奇特的现象,就是手机里的 WebView 是可以在应用商店升级,而不需要跟随系统. 在 Android 跨入 5.0 版本之后,我们在使用 Android 手机的过程中,可能会发现一个奇特的现象,就是手机里的 WebView 是可以在应用商店升级,而不需要跟随系统的。 这一点在 iOS...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。