RocketMQ 分布式事务

一壶清酒 2018-09-11 15:15:29 ⋅ 971 阅读

分布式事务

先回顾一下事务,例如银行转账,A给B转100元,这个动作包括2个步骤:

  1. A账户减100元

  2. B账户加100元

把这2个步骤放在一个事务中,来保证完全成功或者完全失败。

在单体服务中,比较好解决,一个数据库事务就完成了,但在分布式系统中,这2个步骤可能是由不同的子服务分别处理,这就涉及到了分布式事务的概念。

RocketMQ 提供了对事务的支持,可以帮助我们完成分布式事务的处理。

RocketMQ 解决思路

比如事务T,包括T1和T2两个逻辑步骤,系统 A 和 B 分别执行 T1 和 T2。

A 向 RocketMQ 发送一个待确认的消息 M(这个消息不会被发送给B,RocketMQ 先保留这个消息),然后执行T1,A 根据执行结果向 RocketMQ 提交二次确认。

如果T1执行成功了,那么消息M就标记为可投递状态,B将能够接收到,B收到M后,就知道A肯定完成了T1部分的工作,B只需要保证自己完成T2即可;如果T1执行失败了,那么消息M就会被RocketMQ删除掉,B不会收到。

这样,这个分布式事务就完成了。

这个待确认的消息叫做 “half message (半消息)”。

有一个问题,如果A由于某种原因没能向RocketMQ发送二次确认怎么办?

RocketMQ有一个回查机制,就是过一段时间后,发现待确认消息还没有被确认,就会主动向producer询问,producer根据本地事务执行结果给予反馈,是成功了还是失败了。

详细步骤说明

  1. Producer 向 MQ 发送事务类型的 message。

  2. MQ 接收成功后,向 Producer 返回确认信息,这时,half message 就形成了。

  3. Producer 执行本地事务逻辑。

  4. Producer 根据本地执行结果向 MQ 进行二次确认(commit提交 或 rollback回滚),如果是 commit 那么 MQ 就让之前的 half message 变为可以被 Consumer 消费的消息,Consumer 接收消息;如果是 rollback,那么 MQ 就把之前的 half message 废弃掉。

  5. 当步骤4缺失时,MQ 找 Producer 进行回查。

  6. Producer 查看本地事务执行结果。

  7. Producer 根据步骤6的反馈,向 MQ 发送确认信息。


---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦



全部评论: 0

    我有话说:

    高并发下分布式事务的解决方案-MQ消息事务+最终一致性

    分布式事务分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上

    「轻阅读」分布式事务的四种解决方案,成长需要尝试

    分布式事务事务的操作位于不同的节点上,需要保证事务的 AICD 特性。

    「转载」分布式事务方案 - SAGA模式

    性能与架构:杜亦舒原文:https://mp.weixin.qq.com/s/An6QbAOw6jhWxg7GDT56Ug 本文目的是讲清楚 SAGA 这种分布式事务解决方案的实现思路,不包括具体

    精品推荐:如何实现一个TCC分布式事务框架的一点思考

    本文将以Spring容器为例,试图分析一下,实现一个通用的TCC分布式事务框架需要注意的一些问题。

    构建 Netflix 分布式追踪(tracing)体系

    Maulik Pandeyhttps://mp.weixin.qq.com/s/NmGYfoJ7pw8CfRfUkc6o2Q “为什么我的手机不能播放 Tiger King?” — 一位 Twitter 网友留言 这是 Netflix ...

    Java并发解决方案:分布式应用限流实践

    任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也讲到过,但是那是基于单机场景来写。 之前文章:接口限流算法:漏桶算法&令牌桶算法 然而再牛逼的机器,再优化的设计,对于特殊场景我...

    架构实战篇(九):Spring Boot 集成 RocketMQ

    快速集成阿里开源消息队列 RocketMQ

    Martian框架发布 3.0.3 版本,Redis分布式

    项目简介 Martian 是一个声明式 API 编程(DAP)框架,可以帮助你快速开发后端服务。 以HttpServer作为 http服务,彻底脱离Tomcat这一类的Web容器和Servlet,同时也让项目减少了几个依赖 声明式API,让Co...

    Dgraph 1.2.8 发布,事务性分布式图形数据库

    Dgraph 1.2.8 发布了。Dgraph 是一个可扩展的,分布式的,低延迟的图数据库,目标是提供 Google 生产水平的规模和吞吐量,在超过 TB 的结构数据里,为用户提供足够低延迟的实时

    分布式 NewSQL 数据库TiDB 3.1.0 版本发布,修复多项问题

    TiDB 是一款定位于在线事务处理/在线分析处理的融合型数据库产品,实现了一键水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。

    BeetlSQL 3.0.10 发布,内置 sega 事务支持

    本次发布主要增加了分布式Sega事务支持,适合多数据源 按照社区建议,修改了了springboot 的 yml配置方式 修改了@Jackson和@UpdateTime,本来是用来作为例子,但社区

    深度好文!RocketMQ高级进阶知识精讲

      https://juejin.cn/post/6944894142652612638 前言 大家好,我是jack xu,本文是RockeMQ精讲系列的最后一篇,讲的是RockeMQ一些

    BeetlSQL 3.1.0 发布,Spring Saga 事务支持

    本次发布增强了Saga在spring下的支持,使用kafka提供重试以及重试失败后放入丢弃队列里 Saga是用来在微服务中的长事务管理,具备ACID中的ACD,不具备I,隔离性。在一定业务条件下

    Dapr 1.0 发布,分布式应用运行时

    Dapr 1.0 正式发布。 Dapr 是一个开源、可移植的、事件驱动的运行时,可以帮助开发人员构建在云和边缘上运行的弹性的、微服务的、无状态和有状态应用程序,并且关注于业务逻辑而不用考虑分布式相关

    运用Docker快速部署分布式项目

    快速搭建Docker分布式项目环境

    转载:RocketMQ基础概念剖析&源码解析

    Topic Topic是一类消息的集合,是一种逻辑上的分区。为什么说是逻辑分区呢?因为最终数据是存储到Broker上的,而且为了满足高可用,采用了分布式的存储。 这和Kafka中的实现如出一辙