基于RabbitMQ消息队列的分布式事务解决方案(下)

简介: 基于RabbitMQ消息队列的分布式事务解决方案(下)

实现步骤

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

11.png

隐患

  • 可能消息发送失败:
  • 12.png
  • 为确保数据一定成功发送到MQ。在同一事务中,增加一个记录表的操作, 记录每一条发往MQ的数据以及它的发送状态
  • 于是在订单系统中增加一个本地信息表

13.png

不再通过HTTP请求直接调用运单系统接口,而是使用MQ:

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

14.png

15.png

image.png

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

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

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

18.png

确保在SpringBoot项目中开启Confirm机制

19.png

代码实现

21.png

image.png

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

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

  • 运单系统收到消息数据后,突然宕机或访问运单DB时,DB突然宕机,消息数据不就丢了?
  • 23.png
  • 于是还需要如下处理:

➢ 幂等性

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

24.png

➢ 开启手动ACK模式

由消费者控制消息的重发/清除/丢弃

image.png

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

26.png

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

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

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

31.png

4 总结

MQ实现分布式事务分析

优点

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

缺点

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

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


参考

https://tech.meituan.com/2018/07/26/peisong-sys-arch-evolution.html

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
3月前
|
消息中间件 数据管理 Serverless
阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025
阿里云消息团队基于 Apache RocketMQ 构建 Serverless 消息系统,适配多种主流消息协议(如 RabbitMQ、MQTT 和 Kafka),成功解决了传统中间件在可伸缩性、成本及元数据管理等方面的难题,并据此实现 ApsaraMQ 全系列产品 Serverless 化,助力企业提效降本。
|
1月前
|
消息中间件 Java Kafka
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
本文深入解析了 Kafka 和 RabbitMQ 两大主流消息队列在 Spring 微服务中的应用与对比。内容涵盖消息队列的基本原理、Kafka 与 RabbitMQ 的核心概念、各自优势及典型用例,并结合 Spring 生态的集成方式,帮助开发者根据实际需求选择合适的消息中间件,提升系统解耦、可扩展性与可靠性。
155 1
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
|
6月前
|
负载均衡 NoSQL 算法
Redisson分布式锁数据一致性解决方案
通过以上的设计和实现, Redisson能够有效地解决分布式环境下数据一致性问题。但是, 任何技术都不可能万无一失, 在使用过程中还需要根据实际业务需求进行逻辑屏障的设计和错误处理机制的建立。
310 48
|
12月前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
807 105
|
11月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
215 5
|
11月前
|
消息中间件 存储
消息队列的挑战与解决方案:丢失、重复与积压问题
消息队列(MQ)在分布式系统中扮演着重要的角色,用于解耦服务、异步处理任务和提高系统吞吐量。然而,在使用消息队列时,我们可能会遇到消息丢失、重复和积压等问题。本文将探讨这些问题的成因以及相应的解决方案。
388 1
|
11月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
12月前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
187 1
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践

相关产品

  • 云消息队列 MQ