Cloud-借助消息队列解决分布式事务

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

4、Exchange将消息转发到指定的Queue(队列)

----接收消息-----
1、消费者和Broker建立TCP连接
2、消费者和Broker建立通道
3、消费者监听指定的Queue(队列)
4、当有消息到达Queue时Broker默认将消息推送给消费者。
5、消费者接收到消息。

工作流程

生产者将数据通过RabbitMQ-client发送到RabbitMQ-server中的exchange,exchange根据路由配置,分发给Queue,消费者从Queue拿到数据

分布式事务的产生

多个系统相互配合工作,产生数据一致性问题。
例如外卖场景中,下单中心,运单中心两个系统要配合工作,必须保证两个系统数据一致性。
错误的解决方案:
使用API接口调用,下单中心插入数据,调用运单中心的API接口处理数据,并启动事务回滚。
咋一看这场景没有什么问题,毕竟有事务回滚,一起成功一起失败,但其实存在API调用超时的情况,此时下单中心以为调用失败回滚,而运单中心只是超时仍会继续执行程序,从而造成两个系统数据不一致。
假设API调用成功,也有可能是在订单中心提交事务时失败了,此时订单中心回滚,而API已经调用,下单中心的数据已经产生,数据不一致。

使用消息队列解决分布式事务


问题的核心就是保证可靠生产与可靠消费
可靠生产:下单中心处理数据和状态表更改应该保证事务一致。生产者往消息队列发送数据时,在本地建立一张状态表,看是否成功发送给队列。利用RabbitMQ的确认机制看是否重发还是定时扫描状态表重发,保证可靠生产。兜底方案还是定时扫描状态表。
代码

/**

  • 分单处理队列
    */
    public static final String QUEUE_NAME_TRANSACTION = “xucheng.distribute.queue”;

/**

  • 分单处理交换机
    */
    public static final String EXCHANGE_NAME_TRANSACTION = “xucheng.distribute.exchange”;

/**

  • 消息队列服务进程,此进程包括两个部分:Exchange和Queue。
    */
    public static final String ROUTE_NAME_TRANSACTION = “xucheng.distribute.route”;

/**

  • 补单队列
    */
    //public static final String CREATE_QUEUE_NAME_TRANSACTION = “xucheng.order.reCreate.queue”;

/**

  • 1、交换机绑定到分单队列
  • @return
    */
    @Bean
    public DirectExchange transExchange() {
    return new DirectExchange(EXCHANGE_NAME_TRANSACTION);
    }

/**
*2、分单队列
*

  • @return
    */
    @Bean
    public Queue scoreQueue() {
    return new Queue(QUEUE_NAME_TRANSACTION, true);
    }

/**

  • 3、Binding
  • @return
    */
    @Bean
    public Binding bindingExchangeOrderReceiverQueue() {
    //通过Binding将Exchange与Queue关联起来。  
    return BindingBuilder.bind(scoreQueue()).to(transExchange()).with(ROUTE_NAME_TRANSACTION);
    }

最后

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料


本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值