美文网首页
给予消息队列实现分布式事务

给予消息队列实现分布式事务

作者: 刘彦青 | 来源:发表于2019-11-13 18:22 被阅读0次

给予消息队列实现分布式事务

场景:

订单系统产生订单,购物车系统减购物车中的商。

实现思路 :

  1. 订单系统在消息队列上开启一个事务(没有创建订单)。
  2. 订单系统给消息服务器发送一个“半消息”,这个半消息不是说消息内容不完整,它包含的内容就是完整的消息内容,半消息和普通消息的唯一区别是,在事务提交之前,对于消费者来说,这个消息是不可见的。
  3. 半消息发送成功后,订单系统就可以执行本地事务了,在订单库中创建一条订单记录,并提交订单库的数据库事务。
  4. 然后根据本地事务的执行结果决定提交或者回滚事务消息。如果订单创建成功,那就提交事务消息,购物车系统就可以消费到这条消息继续后续的流程。如果订单创建失败,那就回滚事务消息,购物车系统就不会收到这条消息。

橙色和绿色分别是两个事务。

问题:

步骤4事务提交失败;这时候订单系统本地事务已提交尔购物车系统没有收到消息,造成数据不一致。

如何解決消息队列事务提交过程出现的异常:

kafka会直接抛出异常用户自行处理;

在RocketMQ中的事务实现中,增加了事务反查的机制来解决事务消息提交失败的问题 , RocketMQ的Broker没有收到提交或者回滚的请求,Broker会定期去producer上反查这个事务对应的本地事务的状态,然后根据反查结果决定提交或者回滚这个事务。

为了支持事务反查机制,我们的业务代码需要实现一个反查本地事务状态的接口告知RocketMQ本地事务是成功还是失败。

本例中的反查逻辑很简单只需根据消息中的订单ID,在订单库中查询订单是否存在即可。

能不能在订单创建完成后再向消息队列发送订单数据?这样不用考虑订单创建失败而发送消息的情况了

考虑这样一种情况:订单创建成功了,还没来得及发消息,这个节点突然断电了。

还有一种情况订单创建成功,减购物车(后续操作)失败的话要写实物补偿把创建的订单删掉。

能不能这样:

1.开启本地事务创建订单,2.发消息,3.根据发消息是否成功来决定提交还是回滚本地事务。这样不需要事务消息也能解决这个场景的问题了?

如果本地事务提交失败已发送的消息无法撤回,会导致数据不一致。

小结

不论是消息队列事务还是异步事务都遵循事务的四大特性:原子性,一致性,隔离性,持久性。

更多实现分布式事务的方法: https://blog.csdn.net/ityqing/article/details/102655827


**** 码字不易如果对你有帮助请给个关注****

**** 爱技术爱生活 QQ群: 894109590****

相关文章

  • 给予消息队列实现分布式事务

    给予消息队列实现分布式事务 场景: 订单系统产生订单,购物车系统减购物车中的商。 实现思路 : 订单系统在消息队列...

  • RocketMQ与Springboot封装

    消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,日志记录,流量削锋、分布式事务等问题,实现高性...

  • SpirngBoot使用RocketMQ

    消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,日志记录,流量削锋、分布式事务等问题,实现高性...

  • Java微服务下的分布式事务介绍及其解决方案2

    1.前言 本文将详细介绍分布式的解决方案–消息队列实现分布式事务的解决方案,需要大家对我第一篇对分布式事务的介绍来...

  • 分布式事务

    分布式事务其中一种解决方案就是利用消息队列

  • 技术控必读——没有它就没有春晚红包

    编者按: 腾讯云消息服务(Cloud Message Queue)是分布式消息队列服务,能够为分布式事务部署的不同...

  • 《分布式技术原理与算法解析》学习笔记Day19

    分布式通信:消息队列 什么是消息队列? 队列是一种具有先进先出特点的数据结构,消息队列是基于队列实现的、存储具有特...

  • 91 RocketMQ

    RocketMQ 作为一种纯java,分布式,队列模型的开源消息中间件,支持事务消息,顺序消息,批量消息,定时消息...

  • RabbitMQ,RocketMQ,Kafka 事务性,消息丢失

    消息队列常见问题处理 分布式事务 什么是分布式事务 我们的服务器从单机发展到拥有多台机器的分布式系统,各个系统之前...

  • 【JAVA】分布式事务

    分布式事务的解决方案(介绍其中三种)1.两阶段提交协议(2PC)2.事务补偿(TCC)3.消息队列实现最终一致 T...

网友评论

      本文标题:给予消息队列实现分布式事务

      本文链接:https://www.haomeiwen.com/subject/hijkictx.html