狂神说Java之 rabbitmq高级分布式事务

分布式事务的完整架构图 

 案例场景分析

案例一:用RestTemplate演示(不可靠生产,会出现问题)

创建一个订单模块

创建一个OrderDataBaseService服务

 创建一个order的service服务,调用saveOrder()方法

创建一个运单模块

创建一个运单的controller层,定义一个lock接口

创建一个运单的service层,定义一个dispatch()方法,用来controller调用

定义一个测试用例

运行成功之后数据库会保存数据

首先是运单表保存数据

订单表保存数据

现在就来模拟分布式事务产生的错误问题

模拟分布式事务问题:在订单模块OrderService里面的dispatchHttpApi()方法中使用RestTemplate远程调用接口,这里模拟一个连接超时的错误,定义的是连接时间不能超过3秒

接下来去运单模块的controller层的lock()接口中,让他睡眠3秒,来达到订单模块一个错误问题

使用这个测试用例

启动之后就会在订单服务出现一个错误

查看数据库,运单表数据正常

但是订单表没有保存数据 ,因为在订单服务出现读以超时的错误,在createOrder()方法上面定义了事务的注解,出现错误的时候,进行了回滚。

就此,分布式事务问题就此产生。

案例二:使用rabbitmq解决

在OrderDataBaseService服务中,添加一个saveLocalMessage()方法,是用来记录消息是否发送,通过status这个字段判断

 创建一个MQOrderService服务

 创建一个OrderMQService服其中regCallback()方法是用来判断消息是否发送到交换机(rabbitmq是消息到了交换机之后,交换机自动发送给对应的对列)

 

 在运单服务中创建一个OrderMqConsumer类,作为消费者,来监听order.queue对列

启动服务之后,使用这个测试用例

服务会一直报错如下错误:

消费者在消费的过程中出现异常,rabbitmq会出现什么问题和解决方案:

rabbitmq会出现死循环,死循环会造成我们服务的重试,若是个集群,那么就会重试每个集群,会把我们服务器冲垮,把我们rabbitmq的磁盘、内存消耗殆尽,让我们程序宕机

解决办法:1、控制重发次数    2、try+catch+手动ack   3、try+catch+手动ack+死信队列+人工干预

解法一:控制重发次数

解法二: try+catch+手动ack

 OrderMqConsumer类的修改代码如下

使用try-catch的话,就不用在配置文件配置重试次数,就算配置意义不大,因为try-catch和重试次数互异,会使用不到重试次数

解法三:try+catch+手动ack+死信队列+人工干预(常用)

OrderMqConsumer类的代码如下

在订单服务里面配置rabbitmq的信息,配置死信队列

启动服务之后,使用案例二的测试用例,可以看见order.queue对列有一条信息

过了一会之后(此处时间是你配置rabbitmq刷新的时间,默认是5s)就会转移到dead.order.queue对列中,因为在服务端还是报错,rabbitmq就会把这条信息转移到死信队列里面存储

在运单服务中创建一个DeadMqConsumer类,用来消费死信队列信息

代码如下:

 此处的channel.basicNack()方法的第三个参数为false,会直接把消息移除,不会在配置死信队列

 

具体的视屏参考这个RabbitMQ-39、高级-分布式事务-可靠生产和推送确认 | KuangStudy | 飞哥 | 狂神说 | 学相伴_哔哩哔哩_bilibili 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.06.20校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招 | 速腾聚创 RoboSense“天才罗伯特”计划面向全球招募 (内推) 校招 | 速腾聚创 RoboSense“天才罗伯特”计划面向全球招募 (内推) …

java.util.function实现原理和Java使用场景【Function、Predicate集合转换过滤,BiConsumer事件处理】

简介 java.util.function 是 Java 8 引入的一个功能包,它包含了多种函数式接口的定义,使得在 Java 中进行函数式编程变得更为方便。下面我将分别介绍 java.util.function 的作用、实现原理、常用 Java 使用场景以及代码示例。 作用 java.util.function 的主要作用是为 Jav…

Java导出Excel并邮件发送

一、导出Excel 添加maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.10-FINAL</version></dependency><dependency><groupId>org.apache.poi</groupI…

软件设计流程和开发流程及规范(Word)

2 过程总体描述 2.1 过程概述 2.2 过程流程图 3 过程元素描述 3.1 产品方案 3.2 产品设计 3.3 产品实现 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#x…

找不到vcomp140.dll怎么办,总结多种解决方法

​在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcomp140.dll丢失”。那么&#xff0c;vcomp140.dll是什么&#xff1f;它为什么会丢失&#xff1f;丢失后对电脑有什么影响&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍vc…

根据肥胖类型选择减调方向收获窈窕身材

我们生活中胖子很多&#xff0c;从胖到瘦的人也不少&#xff0c;但瘦了后对自己身材满意的人却是不多的&#xff0c;很多人瘦了也只是减掉了身上的赘肉而已&#xff0c;大体的身形却是没有变化的&#xff0c;因此&#xff0c;并不感到满意。因为他们本身的形体是固定的&#xf…

半正定矩阵

在矩阵分析和线性代数中&#xff0c;半正定矩阵&#xff08;Positive Semi-Definite Matrix&#xff0c;简称PSD矩阵&#xff09;是一类重要的矩阵。一个矩阵被称为半正定矩阵有以下几种等价的定义和性质&#xff1a; 定义 一个对称矩阵 M \mathbf{M} M被称为半正定矩阵&…

009、MongoDB的分片策略

目录 MongoDB的分片策略:范围分片vs哈希分片 1. 范围分片(Range Sharding) 1.1 工作原理 1.2 优点 1.3 缺点 1.4 研究支持 2. 哈希分片(Hash Sharding) 2.1 工作原理 2.2 优点 2.3 缺点 2.4 研究支持 3. 选择合适的分片策略 4. 实践案例 4.1 电子商务平台 4.2 社…

SpringBoot-SpringBoot整合Swagger使用教程(图文介绍,一篇就够了)

前言 日常开发中&#xff0c;接口都是和开发文档相结合的。不论是和前端对接还是三方对接亦或者是接口留档&#xff0c;当我们开发完接口后&#xff0c;都需要去创建对应的接口文档。而修改接口后也要修改相对应的接口文档&#xff0c;但是这个真的很容易疏漏。而且相对于繁重的…

WEB攻防【6】——Python考点/CTF与CMS/SSTI模板注入/PYC反编译

#知识点 1、PYC文件反编译 2、python-web-SSTI 3、SSTI模板注入利用分析 SSTI 就是服务器端模板注入 &#xff08;Server-Side Template Injection&#xff09; 当前使用的一些框架&#xff0c;比如python的flask&#xff0c;php的tp&#xff0c;java的spring等一般都采用成…

jQuery的extend方法仅仅是字面意思上的扩展吗?

jQuery中extend的使用方式大多是这样的&#xff1a; jQuery.extend({// Unique for each copy of jQuery on the pageexpando: "jQuery" (version Math.random()).replace(/\D/g, ""),// Assume jQuery is ready without the ready moduleisReady: true,…

存储管理(三):分区表

什么是分区表 假设存在表t&#xff1a; CREATETABLE t (ftimedatetime NOT NULL,c int(11) DEFAULT NULL,KEY (ftime) )ENGINEInnoDB DEFAULT CHARSETlatin1 PARTITION BY RANGE (YEAR(ftime)) (PARTITION p_2017 VALUES LESS THAN (2017) ENGINE InnoDB,PARTITION p_2018 VA…

golang 获取系统的主机 CPU 内存 磁盘等信息

golang 获取系统的主机 CPU 内存 磁盘等信息 要求 需要go1.18或更高版本 官方地址&#xff1a;https://github.com/shirou/gopsutil 使用 #下载包 go get github.com/shirou/gopsutil/v3/cpu go get github.com/shirou/gopsutil/v3/disk go get github.com/shirou/gopsuti…

tr、cut、split、grep -E

目录 tr命令&#xff1a;替换和删除 cut命令&#xff1a;快速裁剪 split命令&#xff1a;文件拆分 文件合并 面试题 1.现在有一个日志文件&#xff0c;有5个G&#xff0c;能不能快速的打开 2.cat合并和paste合并之间的区别&#xff1f; 3.统计当前主机的连接状态&#…

Hadoop3:MapReduce中的Reduce Join和Map Join

一、概念说明 学过MySQL的都知道&#xff0c;join和left join 这里的join含义和MySQL的join含义一样 就是对两张表的数据&#xff0c;进行关联查询 Hadoop的MapReduce阶段&#xff0c;分为2个阶段 一个Map&#xff0c;一个Reduce 那么&#xff0c;join逻辑&#xff0c;就可以…

前端开发的工厂设计模式

在前端开发中&#xff0c;工厂设计模式&#xff08;Factory Pattern&#xff09;是一种非常有用的设计模式&#xff0c;能够帮助我们在创建对象时减少代码的重复性和复杂性。 一、工厂设计模式概述 工厂设计模式是一种创建型设计模式&#xff0c;主要目的是定义一个用于创建对…

2024年建筑八大员(资料员)考试题库,省心高效,轻松通过!

1.插入的图片无法显示&#xff0c;或者显示失真&#xff0c;正确做法是&#xff08;&#xff09;。 A.插人图片是应选中【自动调整图片大小】 B.在下拉【菜单】中选中【按单元格式大小】插入 C.在【格式】下拉中【图片】处打钩 D.在【属性】下拉中选中【工具显示】 答案&a…

机械培训元宇宙:开启未来教育与职业培训的新篇章

随着科技的飞速发展&#xff0c;特别是虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和人工智能&#xff08;AI&#xff09;等先进技术的广泛应用&#xff0c;我们正逐渐步入一个全新的时代——元宇宙。在这个虚拟的、由无数个并行宇宙组成的世界中…

两张图片怎样拼在一起?将两张图片拼在一起的几种方法介绍

两张图片怎样拼在一起&#xff1f;拼接两张图片是一种常见的编辑技巧&#xff0c;能够将不同的视觉元素融合成一个整体&#xff0c;从而创造出更加生动和丰富的图像效果。无论是为了设计创意作品、制作社交媒体内容&#xff0c;还是简单地为个人相册增添趣味&#xff0c;掌握如…

Java锁

乐观锁 什么是乐观锁 每次去拿数据的时候都认为别人不会修改&#xff0c;更新的时候会判断别人是否更新过数据&#xff0c;通过版本来判断&#xff0c;如果数据被修改了就拒绝更新Java里面大量使用CAS&#xff0c;CAS就是属于乐观锁&#xff0c;性能较悲观锁有很大的提高。Atom…