【RabbitMQ——消息应答机制——分布式事务解决方式】
1. RabbitMQ高级-消息确认机制的配置
NONE值是禁用发布确认模式,是默认值
- CORRELATED值是发布消息成功到交换器后会触发回调方法,如1示例
- SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;
# 服务端口
server:port: 8080
# 配置rabbitmq服务
spring:rabbitmq:username: adminpassword: adminvirtual-host: /host: 47.104.141.27port: 5672publisher-confirm-type: correlated
创建一个自己的消息确认类
package com.xuexiangban.rabbitmq.springbootorderrabbitmqproducer.callback;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;public class MessageConfirmCallback implements RabbitTemplate.ConfirmCallback {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if(ack){System.out.println("消息确认成功!!!!");}else{System.out.println("消息确认失败!!!!");}}
}
public void makeOrderTopic(String userId,String productId,int num){// 1: 根据商品id查询库存是否充足// 2: 保存订单String orderId = UUID.randomUUID().toString();System.out.println("保存订单成功:id是:" + orderId);// 3: 发送消息//com.# duanxin//#.email.* email//#.sms.# sms// 设置消息确认机制rabbitTemplate.setConfirmCallback(new MessageConfirmCallback());rabbitTemplate.convertAndSend("topic_order_ex","com.email.sms.xxx",orderId);
}
2. 分布式事务的解决方式
2.1 两阶段提交
2.1.1 概念
两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。
- 准备阶段
- 协调者询问参与者事务是否执行成功,参与者发回事务执行结果。
- 提交阶段
- 如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。
- 需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。
2.1.2 优缺点
- 同步阻塞
- 所有事物参与者在等待其他参与者响应的时候都处于同步阻塞状态,无法进行其他操作。
- 单点问题
- 协调者在2PC中起到非常大的作用,发生故障将会造成很大影响。特别是在阶段二发生故障,所有参与者会一直等待状态,无法完成其它操作。
- 数据不一致
- 在阶段二,如果协调者只发送了部分 Commit 消息,此时网络发生异常,那么只有部分参与者接收到 Commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。
- 太过保守
- 任意一个节点失败就会导致整个事务失败,没有完善的容错机制
2.2 补偿事务(TCC)
2.2.1 概念
TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。它分为三个阶段:
- Try阶段:主要是对业务系统做检测及资源预留
- Confirm阶段:主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 - - - Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。
- Cancel阶段:主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。
举个例子,假入 Bob 要向 Smith 转账,思路大概是: 我们有一个本地方法,里面依次调用 1:首先在 Try 阶段,要先调用远程接口把 Smith 和 Bob 的钱给冻结起来。 2:在 Confirm 阶段,执行远程调用的转账的操作,转账成功进行解冻。 3:如果第2步执行成功,那么转账成功,如果第二步执行失败,则调用远程冻结接口对应的解冻方法 (Cancel)。
2.2.2 优缺点
优点:跟2PC比起来,实现以及流程相对简单了一些,但数据的一致性比2PC也要差一些
缺点:缺点还是比较明显的,在2,3步中都有可能失败。TCC属于应用层的一种补偿方式,所以需要程序员在实现的时候多写很多补偿的代码,在一些场景中,一些业务流程可能用TCC不太好定义及处理。
2.3 本地消息表(异步确认)
2.3.1 概念
本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
- 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
- 之后将本地消息表中的消息转发到 Kafka 等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
- 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。
2.3.2 优缺点
优点: 一种非常经典的实现,避免了分布式事务,实现了最终一致性。
缺点: 消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。
2.4 MQ 事务消息
2.4.1 概念
异步场景,通用性较强,拓展性较高
有一些第三方的MQ是支持事务消息的,比如RocketMQ,他们支持事务消息的方式也是类似于采用的二阶段提交,但是市面上一些主流的MQ都是不支持事务消息的,比如 Kafka 不支持。
以阿里的 RabbitMQ 中间件为例,其思路大致为:
- 第一阶段Prepared消息,会拿到消息的地址。 第二阶段执行本地事务,第三阶段通过第一阶段拿到的地址去访问消息,并修改状态。
- 也就是说在业务方法内要想消息队列提交两次请求,一次发送消息和一次确认消息。如果确认消息发送失败了RabbitMQ会定期扫描消息集群中的事务消息,这时候发现了Prepared消息,它会向消息发送者确认,所以生产方需要实现一个check接口,RabbitMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败。
2.4.2 优缺点
优点: 实现了最终一致性,不需要依赖本地数据库事务。
缺点: 实现难度大,主流MQ不支持,RocketMQ事务消息部分代码也未开源。
3. 具体实现
3.1 可靠的生产流程
通过冗余的本地消息,等待确认机制修改本地消息的标志位。定期循环扫描未被发送的消息。
3.2 基于MQ的分布式事务消息的可靠消费
当消息消费失败时,我们需要对这些消息进行一定的处理
3.2.1 基于MQ的分布式事务消息的消费失败处理
- 设置重试次数,一定要进行控制
- try/catch+basicNack(tag,false,false)+死信队列
相关文章:

【RabbitMQ——消息应答机制——分布式事务解决方式】
1. RabbitMQ高级-消息确认机制的配置 NONE值是禁用发布确认模式,是默认值 CORRELATED值是发布消息成功到交换器后会触发回调方法,如1示例SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功…...

Android Studio Koala中Kotlin引入序列化Parcelable
找了一堆资料没有新构建序列化的方法,踩坑经历如下: 前提是使用Kotlin创建的项目 之前的build.gradle版本写法如下: 但是新版Android Studio Koala使用序列化模式发生了改变,如下: 测试成功如下: 发出来…...
安装postgresql和对应wal2json和pg_tm_aux插件避坑
1、安装原则:要用源码都用源码,要用yum都用yum 安装wal2json避坑 涉及的yum源,可以解决安装postgresql缺少依赖导致的wal2json和pg_tm_aux的报错问题 [centos-sclo-rh] nameCentOS-7 - SCLo rh baseurlhttps://mirrors.aliyun.com/centos/7/…...

OneDrive 全新时代:AI、生产力和回忆触手可及
OneDrive,无人不知,无人不晓。 无论您是在公司、家庭还是在通勤的路上,OneDrive 都能让您无缝管理文件、照片和回忆。OneDrive 受到 94% 的财富 500 强公司、数百万小型企业和无数个人的信赖,它正在改变世界协作、存储和连接的方…...

List子接口
1.特点:有序,有下标,元素可以重复 2.方法:包含Collection中的所有方法,还包括自己的独有的方法(API中查找) 还有ListIterator(迭代器),功能更强大。 包含更多…...

快来了解 Java 内存数据库 H2,不要错过哦
H2 是一个用 Java 编写的开源关系型数据库管理系统,它具有小巧、快速、易于嵌入等特点。 H2 数据库可以以多种模式运行,包括嵌入式模式、服务器模式和内存模式。 在嵌入式模式下,H2 数据库直接嵌入到应用程序中,就像一个本地的库…...

基于Java的可携宠物酒店管理系统的设计与实现(论文+源码)_kaic
摘 要 随着社会经济的不断发展,现如今出行并住酒店的人越来越多,与之而来的是酒店行业的工作量日益增加,酒店的管理效率亟待提升。此外很多人出门旅游时会有携带宠物的情况,但是现如今酒店对宠物的限制,导致许多…...

吸毛效果好的宠物空气净化器分享,希喂、霍尼韦尔、米家实测
说起宠物空气净化器,几年前我可能会一脸鄙夷:为啥要花这种智商税冤枉钱? 直到之前养了一只猫,被家中乱飞的浮毛和滂臭的异味搞到头晕,于是作为i一个养宠的家电测评博主,索性对宠物空气净化器这玩意做了超级…...
Sqlite3入门看这一篇就够(超级详细,从零学起)
Sqlite3入门看这一篇就够(超级详细,从零学起) 一、SQLite3 基础1.1 SQLite3 的特点1.2 SQLite3 安装与使用1.2.1 debian操作系统安装SQLite31.2.2 window操作系统安装SQLite3二、下载 SQLite3三、配置 SQLite 环境四、使用 SQLite34.1. **创建数据库**:4.2. **常用命令**:…...

搭建知识库:助力大健康零售电商的快速发展
一、大健康零售电商行业的快速发展及其对知识库的需求 随着互联网技术的飞速发展和人们对健康意识的显著提升,大健康零售电商行业迎来了前所未有的发展机遇。这一行业不仅涵盖了传统零售业的商品销售,还融入了健康管理、健康咨询、健康数据分析等多元化…...

纠删码参数自适应匹配问题ECP-AMP实验方案(中)
6.方法设计 6.1.数据获取 为了收集不同的文件大小和纠删码参数对性能指标的影响,本文在Hadoop平台上进行了模拟实验。Hadoop是一种开源的分布式存储和计算框架,它可以支持不同类型的纠删码,并提供了一些应用程序接口和工具来测试和评估纠删…...
在设计接口时,什么时候应该用路径参数,什么时候将数据保存到方法体中,它们各自的优势是什么?
在设计 RESTful API 接口时,选择将数据放在路径参数(Path Parameters)还是方法体(Request Body)中,取决于具体的需求和使用场景。每种方式都有其优势和适用的场景。 路径参数(Path Parameters&a…...
JVa冒泡排序
------------------------------冒泡排序--------------- let arry[1,2,3,4,5,6]; let temo;//容器交换 //两层循环 for(let i1;i<arry.length;i){ for(let j0;j<arry.length-i;j){ if(arry[j]>arry[j1]){ temparry[j]; arry[j]arry[j1]; arry[j1]temp; } } } console…...

10/11
一、ARM课程大纲 二、ARM课程学习的目的 2.1 为了找到一个薪资水平达标的工作(单片机岗位、驱动开发岗位) 应用层(APP) 在用户层调用驱动层封装好的API接口,编写对应的API接口 ----------------------------------------------------…...

C语言复习第6章 指针(未完成)
目录 一、内存单元与指针1.1 内存单元与内存单元的编号(地址/指针)1.2 内存单元的编号是如何产生的?1.3 地址/内存单元的编号/指针 本身是不需要保存的1.4 32/64位机器最多可以管理多大的内存空间?1.5 怎么计算指针(地址/编号)的大小 二、指针到指针变量2.1 怎么把二进制转换…...
Carrier Aggregation 笔记
### Carrier Aggregation 笔记 #### 引言 - Carrier Aggregation(CA)是 LTE 高级技术之一,srsRAN 4G 支持在 srsENB 和 srsUE 中进行双载波聚合。 - 使用 srsRAN 4G 进行 CA 实验需要能够调谐不同频率的 RF 设备,例如 Ettus Rese…...
JAVA的ArrayList 和 LinkedList的区别
ArrayList 和 LinkedList 都是 Java 中常用的 List 接口的实现类,主要的区别有: 1. 底层数据结构不同 -ArrayList 底层使用的是动态数组数据结构,LinkedList 底层使用的是双向链表数据结构。 2. 获取元素效率不同 ArrayList 支持快速随机访问,通过索引直接获取元素,时间复杂…...

AI知识库如何提升服装电商的运营效率
随着人工智能技术的飞速发展,AI知识库在服装电商领域的应用日益广泛。AI知识库作为一个集成了海量数据、通过高级算法进行智能分析和处理的信息系统,正在深刻改变服装电商的运营模式和效率。本文将详细阐述AI知识库在商品信息管理、库存管理、订单处理等…...
鸿蒙开发(NEXT/API 12)【使用fetch发送网络请求】远场通信服务
场景介绍 发送一个HTTP请求,也可以设置请求头和请求体等参数,并返回来自服务器的HTTP响应。使用Promise异步回调。常用于获取资源,支持流处理和通过拦截器来处理请求和响应。 接口说明 接口名描述fetch(request: Request): Promise发送一个…...

详细解读“霸王面”战术
“霸王面”战术是指在没有得到雇主面试通知的情况下,强行加入面试,以此争取工作机会的求职策略。以下将以3000字左右的篇幅,通过生动形象的例子详细解释这一战术。 一、背景介绍 在当今竞争激烈的就业市场中,求职者需要经历网申…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
GB/T 43887-2024 核级柔性石墨板材检测
核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标: 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)
当我们网关配置好了,DNS也配置好了,最后在虚拟机里还是无法访问百度的网址。 第一种情况: 我们先考虑一下,网关的IP是否和虚拟机编辑器里的IP一样不,如果不一样需要更改一下,因为我们访问百度需要从物理机…...

关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
Q1起重机指挥理论备考要点分析
Q1起重机指挥理论备考要点分析 一、考试重点内容概述 Q1起重机指挥理论考试主要包含三大核心模块:安全技术知识(占40%)、指挥信号规范(占30%)和法规标准(占30%)。考试采用百分制,8…...