通过消息队列mq解决分布式事务问题的原理

简介: 通过消息队列mq解决分布式事务问题的原理

公众号merlinsea


  • 核心
  • 利用队列的延迟特性,只有二次确认的消息才能被消费者监听使用。适用于上下游事务不保证实时一致性,但可以保证最终一致性的业务场景。


  • 原理
  • 通过mq实现分布式事务的最终一致性,其中消息生产者是分布式事务中的一个节点,消息消费者也是分布式事务的一个节点。当消息生产者往消息队列中投递消息,此时消息还不能被消费者立即消费(即处于为为投递状态),当消息生产者完成了本地事务的时候,就向消息队列发送确认消息,此时消息队列中的消息才能被投递,然后消费者监听到消息,就去执行相关分布式事务的操作。因此可以看出通过消息队列解决分布式事务问题不能保证实时的事务一致性,但最终可以达到事务的一致性。


  • 半事务消息
  • 暂不能投递的消息,发送方已经成功地将消息发送到了消息队列服务端,但是消息队列还未收到生产者对该消息的二次确认,因此这种消息是暂时不能被消费者监听。此时该消息被标记成“暂不能投递”状态,处于该种状态下的消息即半事务消息。

640.jpg


  • 消息回查
  • 由于网络闪断、生产者应用重启等原因,导致某条事务消息的二次确认丢失,消息队列服务端通过定时任务扫描发现某条消息长期处于 “半事务消息”时,需要主动向消息生产者询问该消息的最终状态(Commit或是Rollback),该询问过程即消息回查


  • 利用消息队列解决分布式事务问题的优缺点
  • 优点
  • 事务消息不仅可以实现应用之间的解耦,又能保证数据的最终一致性
  • 同时将传统的大事务可以被拆分为小事务,能提升效率
  • 不会因为某一个关联应用的不可用导致整体回滚,从而最大限度保证核心系统的可用性
  • 缺点
  • 不能实时保证数据一致性
  • 极端情况下需要人工补偿,比如假如生产者成功处理本地业务,消费者始终消费不成功

640.jpg


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
9天前
|
消息中间件 SQL 中间件
大厂都在用的分布式事务方案,Seata+RocketMQ带你打破10万QPS瓶颈
分布式事务涉及跨多个数据库或服务的操作,确保数据一致性。本地事务通过数据库直接支持ACID特性,而分布式事务则需解决跨服务协调难、高并发压力及性能与一致性权衡等问题。常见的解决方案包括两阶段提交(2PC)、Seata提供的AT和TCC模式、以及基于消息队列的最终一致性方案。这些方法各有优劣,适用于不同业务场景,选择合适的方案需综合考虑业务需求、系统规模和技术团队能力。
87 7
|
1月前
|
存储 Dubbo Java
分布式 RPC 底层原理详解,看这篇就够了!
本文详解分布式RPC的底层原理与系统设计,大厂面试高频,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 RPC 底层原理详解,看这篇就够了!
|
14天前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
44 4
|
2月前
|
消息中间件 网络协议 C#
C#使用Socket实现分布式事件总线,不依赖第三方MQ
`CodeWF.EventBus.Socket` 是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。
C#使用Socket实现分布式事件总线,不依赖第三方MQ
|
2月前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
89 9
|
2月前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
85 7
|
1月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
2月前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
2月前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践