iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring Boot + RabbitMQ如何实现分布式事务
  • 337
分享到

Spring Boot + RabbitMQ如何实现分布式事务

2023-06-03 16:06:02 337人浏览 泡泡鱼
摘要

小编给大家分享一下Spring Boot + RabbitMQ如何实现分布式事务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一:分布式事务解决方案1.两阶段提交(2PC)第一阶段:事务协调器要求每个涉及到事务的数据库预提

小编给大家分享一下Spring Boot + RabbitMQ如何实现分布式事务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一:分布式事务解决方案

1.两阶段提交(2PC)

第一阶段:事务协调器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交.

第二阶段:事务协调器要求每个数据库提交数据。

Spring Boot + RabbitMQ如何实现分布式事务

案例可参照Http://blog.itpub.net/28624388/viewspace-2137095/

2.补偿事务(TCC)

TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。它分为三个阶段:

Try 阶段主要是对业务系统做检测及资源预留

Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。

Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。

3.本地消息表(异步确保)

本地消息表这种实现方式应该是业界使用最多的,其核心思想是将分布式事务拆分成本地事务进行处理。

Spring Boot + RabbitMQ如何实现分布式事务

基本思路:

a.消息生产方,需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。如果消息发送失败,会进行重试发送。

b.消息消费方,需要处理这个消息,并完成自己的业务逻辑。此时如果本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。

c.生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。如果有靠谱的自动对账补账逻辑,这种方案还是非常实用的。

二:Spring Boot + RabbitMQ分布式事务实现

1.pom.xml依赖配置

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

 2.application.yaml  rabbitmq配置

# RabbitMQ          rabbitmq:    host: 112.74.105.178    port: 5672    username: admin    passWord: admin    virtual-host: /    publisher-confirms: true    publisher-returns: true    listener:      simple:        acknowledge-mode: manual

3.RabbitMQConfig.java

@Configurationpublic class RabbitMQConfig {// 下单并且派单存队列public static final String ORDER_DIC_QUEUE = "order_dis_queue";// 补单队列,判断订单是否已经被创建public static final String ORDER_CREATE_QUEUE = "order_create_queue";// 下单并且派单交换机private static final String ORDER_EXCHANGE_NAME = "order_exchange_name";@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate template = new RabbitTemplate(connectionFactory);template.setMessageConverter(new Jackson2JSONMessageConverter());return template;}@Beanpublic SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setMessageConverter(new Jackson2jsonMessageConverter());return factory;}@Beanpublic Queue OrderDicQueue() {return new Queue(ORDER_DIC_QUEUE);}@Beanpublic Queue OrderCreateQueue() {return new Queue(ORDER_CREATE_QUEUE);}@BeanDirectExchange directOrderExchange() {return new DirectExchange(ORDER_EXCHANGE_NAME);}@BeanBinding bindingExchangeOrderDicQueue() {return BindingBuilder.bind(OrderDicQueue()).to(directOrderExchange()).with("orderRoutingKey");}@BeanBinding bindingExchangeOrderCreateQueue() {return BindingBuilder.bind(OrderCreateQueue()).to(directOrderExchange()).with("orderRoutingKey");}}

4. 消息生产者

public class MsgPushInfoServiceImpl extends ServiceImpl<MsgPushInfoMapper, MsgPushInfoEntity>implements MsgPushInfoService, RabbitTemplate.ConfirmCallback {@Autowiredprivate RabbitTemplate rabbitTemplate;public void orderAndDsipatch() {try {String orderId = "123456";JSONObject jsonObect = new JSONObject();jsonObect.put("orderId", orderId);String msg = jsonObect.toString();System.out.println("msg:" + msg);MessageProperties messageProperties = new MessageProperties();        messageProperties.setContentType("application/json");        messageProperties.setMessageId(orderId);        Message message = new Message(msg.getBytes(),messageProperties);        CorrelationData correlationData = new CorrelationData(orderId);rabbitTemplate.setMandatory(true);rabbitTemplate.setConfirmCallback(this);rabbitTemplate.convertAndSend("order_exchange_name", "orderRoutingKey", message, correlationData);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {String orderId = correlationData.getId();System.out.println("消息id:" + orderId);if (ack) { // 消息发送成功System.out.println("消息发送确认成功");} else {// 重试机制System.out.println("消息发送确认失败:" + cause);}}}

5.消息消费者

@Componentpublic class DispatchReceiver {@RabbitHandler@RabbitListener(queues = "order_dis_queue", containerFactory = "rabbitListenerContainerFactory")public void process(Message message, Channel channel) {System.out.println("rev : " + message.getMessageProperties().getMessageId());try {System.out.println("======basicNack====="+message.getMessageProperties().getDeliveryTag());//业务处理成功,则删除消息channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);//业务处理失败,则发送补偿消息} catch (Exception e) {e.printStackTrace();}}}

看完了这篇文章,相信你对“Spring Boot + RabbitMQ如何实现分布式事务”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Spring Boot + RabbitMQ如何实现分布式事务

本文链接: https://www.lsjlt.com/news/234947.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Boot + RabbitMQ如何实现分布式事务
    小编给大家分享一下Spring Boot + RabbitMQ如何实现分布式事务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一:分布式事务解决方案1.两阶段提交(2PC)第一阶段:事务协调器要求每个涉及到事务的数据库预提...
    99+
    2023-06-03
  • Spring Boot 实现Redis分布式锁原理
    目录分布式锁实现引入jar包封装工具类模拟秒杀扣减库存测试代码方案优化问题1:扣减库存逻辑无法保证原子性,问题2:如果加锁失败,则会直接访问,无法重入锁总结分布式锁实现 引入jar包...
    99+
    2022-11-13
    Spring Boot 实现Redis分布式锁 Spring Boot  Redis分布式锁
  • spring boot如何实现对RabbitMQ整合
    本篇文章为大家展示了spring boot如何实现对RabbitMQ整合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.Fanout Exchange介绍Fanout Exchange 消息广播的...
    99+
    2023-05-31
    springboot rabbitmq bit
  • Java Spring Boot分布式事务问题怎么解决
    这篇文章主要讲解了“Java Spring Boot分布式事务问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Spring Boo...
    99+
    2023-07-02
  • Spring Boot集成Seata怎样解决分布式事务问题
    Spring Boot集成Seata怎样解决分布式事务问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。seata 简介Seata 是 阿里巴巴2019年开源的分布式事务解...
    99+
    2023-06-05
  • Spring Boot中怎么利用Redis实现分布式锁
    Spring Boot中怎么利用Redis实现分布式锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。分布式锁介绍Spring Boot 实现 Redis 分布式锁在 sprin...
    99+
    2023-06-16
  • 一文搞明白Java Spring Boot分布式事务解决方案
    目录前言1. 什么是反向补偿2. 基本概念梳理3. 什么是两阶段提交4. AT 模式5. TCC 模式6. XA 模式7. Saga 模式前言 分布式事务,咱们前边也聊过很多次了,网...
    99+
    2022-11-13
  • Spring Boot整合Zookeeper实现分布式锁的场景分析
    目录一、Java当中关于锁的概念1.1.什么是锁1.2.锁的使用场景1.3.什么是分布式锁1.4.分布式锁的使用场景二、zk实现分布式锁2.1.zk中锁的种类:2.2.zk如何上读锁...
    99+
    2022-11-13
  • Spring Boot集成ShedLock分布式定时任务的实现示例
    目录一、ShedLock是什么?二、落地实现1.1 引入依赖包1.2 配置数据库连接信息1.3 创建Mysql数据表1.4 配置LockProvider1.5 创建定时Job1.6 ...
    99+
    2022-11-12
  • Spring Boot 集成Redisson实现分布式锁详细案例
    目录前言分布式锁实现引入jar包Redisson的配置application.yml中引入redisson.yml配置redisson.yml配置封装Redisson工具类模拟秒杀扣...
    99+
    2022-11-13
    Spring Boot 集成Redisson Spring Boot 分布式锁
  • 使用spring boot如何实现对RabbitMQ进行整合
    使用spring boot如何实现对RabbitMQ进行整合?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springboot集成RabbitMQ非常简单,如果...
    99+
    2023-05-31
    springboot rabbitmq
  • 利用consul在spring boot中实现分布式锁场景分析
    因为在项目实际过程中所采用的是微服务架构,考虑到承载量基本每个相同业务的服务都是多节点部署,所以针对某些资源的访问就不得不用到用到分布式锁了。 这里列举一个最简单的场景,假如有一个智...
    99+
    2022-11-12
  • Spring Boot/Spring Session/Redis的分布式Session共享如何解决
    本篇文章为大家展示了Spring Boot/Spring Session/Redis的分布式Session共享如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。分布式Web网站一般都会碰到集群s...
    99+
    2023-05-31
    springboot spring session redis
  • Spring boot 整合 Redisson实现分布式锁并验证功能
    目录简述1. 在idea中新建spring boot工程并引入所需依赖2. 编写相关代码实现3. 模拟实际环境验证3.1 下载idea的docker插件并配置相关镜像信息3.2 将s...
    99+
    2022-11-13
  • 如何用C#实现SAGA分布式事务
    目录背景成功的 SAGA异常的 SAGA子事务屏障写在最后背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的...
    99+
    2022-11-13
    Saga分布式事务 C#实现SAGA分布式事务
  • Java Spring boot整合RabbitMQ如何实现B2B2C小程序电子商务
    小编给大家分享一下Java Spring boot整合RabbitMQ如何实现B2B2C小程序电子商务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!之前我们发送和接收到队列中的消息,现在是时候在 RabbitMQ 中引入完...
    99+
    2023-06-05
  • Mycat 分布式事务的实现
    引言:Mycat已经成为了一个强大的开源分布式数据库中间件产品。面对企业应用的海量数据事务处理,是目前最好的开源解决方案。但是如果想让多台机器中的数据保存一致,比较常规的解决方法是引入“协调者”来统一调度所...
    99+
    2022-10-18
  • springboot整合rocketmq如何实现分布式事务
    这篇文章给大家分享的是有关springboot整合rocketmq如何实现分布式事务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 执行流程(1) 发送方向 MQ 服务端发送消息。(2) MQ Server 将...
    99+
    2023-06-15
  • Zookeeper怎么实现分布式事务
    Zookeeper本身并不直接支持分布式事务,但可以作为分布式事务的基础设施来帮助实现分布式事务。以下是一种可能的实现方式: 使...
    99+
    2023-10-27
    Zookeeper
  • 如何利用Redis实现分布式事务管理
    如何利用Redis实现分布式事务管理引言:随着互联网的快速发展,分布式系统的使用越来越广泛。在分布式系统中,事务管理是一项重要的挑战。传统的事务管理方式在分布式系统中难以实现,并且效率低下。而利用Redis的特性,我们可以轻松地实现分布式事...
    99+
    2023-11-07
    管理 redis 分布式事务
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作