基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 1 极速了解MQ介绍Rabbitmg用于解决分布式事务必须掌握的5个核心概念一款分布式消息中间件,基于erlang语言开发, 具备语言级别的高并发处理能力。和Spring框架是同一家公司。支持持久化、高可用核心5个概念:Queue: 真正存储数据的地方Exchange: 接收请求,转存数据Bind: 收到请求后存储到哪里消息生产者:发送数据的应用消息消费者: 取出数据处理的应用2、分布式事务问题分布式事务是一个业务问题,不能脱离具体的场景。

1 极速了解MQ

介绍Rabbitmg用于解决分布式事务必须掌握的5个核心概念

一款分布式消息中间件,基于erlang语言开发, 具备语言级别的高并发处理能力。和Spring框架是同一家公司。
支持持久化、高可用

核心5个概念:

  1. Queue: 真正存储数据的地方
  2. Exchange: 接收请求,转存数据
  3. Bind: 收到请求后存储到哪里
  4. 消息生产者:发送数据的应用
  5. 消息消费者: 取出数据处理的应用

2、分布式事务问题

分布式事务是一个业务问题,不能脱离具体的场景。

2.1 分布式事务的几种解决方案

● 基于数据库XA/ JTA协议的方式
需要数据库厂商支持; JAVA组件有atomikos等
● 异步校对数据的方式
支付宝、微信支付主动查询支付状态、对账单的形式;
● 基于可靠消息(MQ)的解决方案
异步场景;通用性较强;拓展性较高
● TCC编程式解决方案
严选、阿里、蚂蚁金服自己封装的DTX

本文目标:针对所有人群,学会基于可靠消息来解决分布式事务问题。
分布式事务的解决方案,业务针对性很强,重要的是思路,而不是照搬

  • 美团点评系统架构

2.2 多系统间的分布式事务问题

  • 用户下单生成订单
  • 需要传递订单数据,由此产生两个事务一致性问题

错误的案例

当接口调用失败时,订单系统事务回滚,提示用户操作失败

误以为这样的接口调用写法,就不会有分布式事务问题

接口调用成功或者失败,都会产生分布式事务问题:

  1. 接口调用成功,订单系统数据库事务提交失败,运单系统没有回滚,产生数据
  2. 接口调用超时,订单系统数据库事务回滚,运单系统接口继续执行,产生数据

上述两种情况,都会导致数据不一致的问题

3、实现分布式事务 - 五步法

通过MQ解决分布式事务的5个步骤, 以及分布式事务处理中要注意的地方

  • 之前都是订单系统发送HTTP请求运单系统的接口,出问题了!
  • 因此我们考虑发消息给MQ, 异步暂存!

3.1 整体设计思路


外卖下订单后,可以慢慢等待运单中心数据生成,并非强制要求同时性

  1. 可靠生产:保证消息一定要发送到Rabitmq服务
  2. 可靠消费:保证消息取出来一定正确消费掉

最终使多方数据达到一致。

3.2 步骤1 - 可靠的消息生产记录消息发送

  • 存在隐患 - 可能消息发送失败呀!

为了确保数据一定成功发送到MQ。
在同一事务中,增加一个记录表的操作, 记录每一条发往MQ的数据以及它的发送状态
于是我们在订单系统中增加一个本地信息表

于是在代码实践中,不再通过HTTP接口调用运单系统接口,而是使用MQ

生成订单时,也保存本地信息表


3.3 步骤2 - 可靠消息生产(修改消息发送状态)

  • 利用RabbitMQ事务发布确认机制(confirm)
    开启后,MQ准确受理消息会返回回执

  • 然后就能知道如何更新本地信息表了

-确保在SB中开启Confirm机制


  • 如果出现回执没收到、消息状态修改失败等特殊情况
    兜底方案:定时检查消息表,超时没发送成功,再次重发

3.4 步骤3 - 可靠消息处理(正常处理)

  • 运单系统收到消息数据后,突然宕机,或者访问运单DB时,DB突然宕机,消息数据不就丢了吗!!!

于是需要以下特性:

幂等性
防止重复消息数据的处理,一次用户操作,只对应一次数据处理

开启手动ACK模式
由消费者控制消息的重发/清除/丢弃

3.5 步骤4 - 可靠消息处理(消息重发)


消费者处理失败,需要MQ再次重发给消费者。
出现异常一般会重试几次,由消费者自身记录重试次数,并进行次数控制(不会永远重试!)

3.6 步骤五 - 可靠消息处理(消息丢弃)

消费者处理失败,直接丢弃或者转移到死信队列(DLQ)
重试次数过多、消息内容格式错误等情况,通过线上预警机制通知运维人员

4 总结及扩展

4.1 MQ方案的优点和缺点

口优点

  1. 通用性强
  2. 拓展性强
  3. 方案成熟

口缺点

  1. 基于消息中间件,只适合异步场景
  2. 消息处理会有延迟,需要业务上能够容忍

尽量避免分布式事务;
尽量将非核心事务做成异步;

4.2 拓展

分布式事务解决方案的理论依据

CAP理论
BASE理论
2PC协议
3PC协议
Paxos算法.
Raft一致性协议

参考

美团配送系统架构演进实践

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
27天前
|
存储 分布式计算 大数据
HBase分布式数据库关键技术与实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析了HBase的核心技术,包括数据模型、分布式架构、访问模式和一致性保证,并探讨了其实战应用,如大规模数据存储、实时数据分析及与Hadoop、Spark集成。同时,分享了面试经验,对比了HBase与其他数据库的差异,提出了应对挑战的解决方案,展望了HBase的未来趋势。通过Java API代码示例,帮助读者巩固理解。全面了解和掌握HBase,能为面试和实际工作中的大数据处理提供坚实基础。
45 3
|
2月前
|
消息中间件 网络协议 JavaScript
MQTT常见问题之微消息队列mqtt支持ipv6失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
6天前
|
监控 NoSQL 算法
探秘Redis分布式锁:实战与注意事项
本文介绍了Redis分区容错中的分布式锁概念,包括利用Watch实现乐观锁和使用setnx防止库存超卖。乐观锁通过Watch命令监控键值变化,在事务中执行修改,若键值被改变则事务失败。Java代码示例展示了具体实现。setnx命令用于库存操作,确保无超卖,通过设置锁并检查库存来更新。文章还讨论了分布式锁存在的问题,如客户端阻塞、时钟漂移和单点故障,并提出了RedLock算法来提高可靠性。Redisson作为生产环境的分布式锁实现,提供了可重入锁、读写锁等高级功能。最后,文章对比了Redis、Zookeeper和etcd的分布式锁特性。
46 16
探秘Redis分布式锁:实战与注意事项
|
9天前
|
消息中间件 存储 监控
写了10000字:全面学习RocketMQ中间件
以上是 V 哥在授课时整理的全部 RocketMQ 的内容,在学习时重点要理解其中的含义,正所谓知其然知其所以然,希望这篇文章可以帮助兄弟们搞清楚RocketMQ的来龙去脉,必竟这是一个非常常用的分布式应用的中间件,好了,今天的内容就分享到这,我靠!已经 00:36分,建议收藏起来,慢慢消化,创作不易,喜欢请点赞转发。
|
14天前
|
消息中间件 大数据 Java
消息队列 MQ
消息队列 MQ
24 3
|
17天前
|
消息中间件 数据安全/隐私保护
MQTT微消息队列服务器连接报错:Error: Connection refused: Not authorized
使用MQTTX工具进行测试时,通过AccessKey创建了Client ID的用户名和密码。配置了公网接入点及端口1883,但尝试连接时出现错误。已附上工具截图:![](https://ucc.alicdn.com/pic/developer-ecology/3byii5uar64gg_36327474e991439da422f38c450ef153.png)。确认过用户名、密码和Client ID无误,问题仍未解决,期待回复!
|
1月前
|
消息中间件 存储 监控
解析RocketMQ:高性能分布式消息队列的原理与应用
RocketMQ是阿里开源的高性能分布式消息队列,具备低延迟、高吞吐和高可靠性,广泛应用于电商、金融等领域。其核心概念包括Topic、Producer、Consumer、Message和Name Server/Broker。RocketMQ支持异步通信、系统解耦、异步处理和流量削峰。关键特性有分布式架构、顺序消息、高可用性设计和消息事务。提供发布/订阅和点对点模型,以及消息过滤功能。通过集群模式、存储方式、发送和消费方式的选择进行性能优化。RocketMQ易于部署,可与Spring集成,并与Kafka等系统对比各有优势,拥有丰富的生态系统。
133 4
|
1月前
|
消息中间件 存储 负载均衡
消息队列学习之RabbitMQ
【4月更文挑战第3天】消息队列学习之RabbitMQ,一种基于erlang语言开发的流行的开源消息中间件。
18 0
|
2月前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
40 1
|
2月前
|
存储 缓存 监控
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
41 0

相关产品

  • 云消息队列 MQ