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

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

公众号merlinsea


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


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


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

640.jpg


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


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

640.jpg


相关实践学习
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
相关文章
|
2月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
34 0
|
21天前
|
存储 分布式计算 Hadoop
Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
36 3
|
21天前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
70 2
|
4天前
|
消息中间件 测试技术 数据库
基于RocketMQ实现分布式事务(下)
基于RocketMQ实现分布式事务(上)
19 0
|
4天前
|
消息中间件 Java 测试技术
基于RocketMQ实现分布式事务(上)
基于RocketMQ实现分布式事务(上)
18 0
|
8天前
|
消息中间件 大数据 Java
消息队列 MQ
消息队列 MQ
18 3
|
9天前
|
存储 NoSQL 分布式数据库
【Flink】Flink分布式快照的原理是什么?
【4月更文挑战第21天】【Flink】Flink分布式快照的原理是什么?
|
11天前
|
消息中间件 数据安全/隐私保护
MQTT微消息队列服务器连接报错:Error: Connection refused: Not authorized
使用MQTTX工具进行测试时,通过AccessKey创建了Client ID的用户名和密码。配置了公网接入点及端口1883,但尝试连接时出现错误。已附上工具截图:![](https://ucc.alicdn.com/pic/developer-ecology/3byii5uar64gg_36327474e991439da422f38c450ef153.png)。确认过用户名、密码和Client ID无误,问题仍未解决,期待回复!
|
24天前
|
消息中间件 存储 监控
解析RocketMQ:高性能分布式消息队列的原理与应用
RocketMQ是阿里开源的高性能分布式消息队列,具备低延迟、高吞吐和高可靠性,广泛应用于电商、金融等领域。其核心概念包括Topic、Producer、Consumer、Message和Name Server/Broker。RocketMQ支持异步通信、系统解耦、异步处理和流量削峰。关键特性有分布式架构、顺序消息、高可用性设计和消息事务。提供发布/订阅和点对点模型,以及消息过滤功能。通过集群模式、存储方式、发送和消费方式的选择进行性能优化。RocketMQ易于部署,可与Spring集成,并与Kafka等系统对比各有优势,拥有丰富的生态系统。
110 4
|
25天前
|
消息中间件 存储 负载均衡
消息队列学习之RabbitMQ
【4月更文挑战第3天】消息队列学习之RabbitMQ,一种基于erlang语言开发的流行的开源消息中间件。
17 0