分布式事务解决方案-消息中间篇|学习笔记

简介: 快速学习分布式事务解决方案-消息中间篇

开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第五阶段分布式事务解决方案-消息中间篇】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/687/detail/11924


分布式事务解决方案-消息中间篇


内容介绍

一、前言

二、可靠消息服务


一、前言

基于可靠消息服务实现分布式事务控制的解决方案,这种解决方案在

此前讲解 RocketMQ 的时候已经讲解过了,在 RocketMQ 中有一种事

务消息,涵盖事务消息的交互流程以及代码如何编写的详细讲解。现

在所讲解的基于可靠消息服务与此事务消息很相似,只不过前者的理

论更加详细一些。


二、可靠消息服务

1、基本介绍

基于可靠消息服务的方案是通过消息中间件来保证上下游应用数据

操作的一致性。对此就可以认为消息中间件就是 RocketMQ。如果对

这两个上下游系统不容易理解的话,就可以认为上游是订单,下游是

商品。

2、案例分析

假设有A和B两个系统,比如A系统为订单,B系统为库存,分

别可以处理任务A和任务B。订单可以处理写入订单的任务,商品

可以处理扣减库存的任务,这是前提条件。

此时存在一个业务流程,需要将任务A和任务B在同一个事务中进

行处理。这时可以认为业务流程就是下单,写入订单和扣减库存这两

个操作就要在一个事务中完成了。对此就可以使用消息中间件来实现

这种分布式事务。

image.png

3、使用消息中间件实现分布式事务的步骤

使用消息中间件来实现这种分布式事务大体需要两个步骤。这两个步

骤是以消息中间件为切分的。前面消息由系统A投递到中间件认作

是第一步,后面消息中间件投递到B系统认为是第二步。

(1)消息由系统A投递到中间件

①系统A处理任务前,首先向消息中间件发送一条消息。

②消息中间件收到后将该条消息持久化,但不会立即投递。持久化成

功后,向A回复一个确认应答。

消息中间件收到后将该条消息做一个本地的持久化,但并不会将其立

即投递到B系统中,而是会等待A系统的一个确认。在 RocketMQ

中,会把这种消息称作半事务消息。半事务消息一旦保存成功之后,

就会由中间件向A系统返回一个保存成功的确认。

③系统A收到确认应答后,则可以开始处理任务A,也就是可以向

数据库写订单了。

写订单必然会有两个结果,要么成功,要么失败。不管是成功还是失

败,都会将结果再次提交到消息中间件中。中间件收到消息以后,就

可以作出响应了。如果A系统提交到消息中间件是失败的,即写入

订单失败了,所以消息中间件就不会向B系统投递消息了。这样的

话对于A、B两个系统而言相当于没有事情执行。如果A系统提交

的消息执行成功了,即写入订单成功了,这时消息中间件就会将消息

发送到B系统中。

④任务A处理完成后,向消息中间件发送 Commit 或者 Rollback

请求。该请求发送完成后,对系统A而言,该事务的处理过程就结束

了。

⑤如果消息中间件收到 Commit,则向B系统投递消息;如果收到

Rollback,则直接丢弃消息,但是如果消息中间件收不到 Commit 和

Rollback 指令,那么就要依靠"超时询问机制"。

从A系统要发送消息到中间件,中间件要等待A系统再次提交请求

作消息的确认,但是一直未等到提交的响应。作为消息中间件来讲,

提交一个半事务的消息但是始终未作出确认,对于消息未明确是提交

还是回滚,这时消息中间件就不知道如何执行了。

在 RocketMQ 中有一种消息回查机制,当消息超过一定时间未确认,

这时就需要消息中间件去查询A系统的消息是怎样的,就需要在A

系统中提供一个消息查询的接口,对其不称作消息回查而是消息询问

机制。如果消息中间件未收到 Commit 和 Rollback 指令,就会启动

询问机制了。

(2)消息由中间件投递到系统B

消息中间件向下游系统投递完消息后便进入阻寒等待状态,下游系统

便立即进行任务的处理,任务处理完成后便向消息中间件返回应答。

如果消息中间件收到确认应答后便认为该事务处理完毕。

如果消息中间件在等待确认应答超时之后就会重新投递,直到下游消

费者返回消费成功响应为止。

一般消息中间件可以设置消息重试的次数和时间间隔,如果最终还是

不能成功投递,则需要进行手工干预。这里之所以使用人工干预,而

不是使用让A系统回滚,主要是考虑到整个系统设计的复杂度问题。

如果让A系统再提供一个回滚的接口,就相对麻烦了。

基于可靠消息服务的分布式事务,前半部分使用异步,注重性能;后

半部分使用同步,注重开发成本。

这就是基于可靠消息服务如何来实现分布式事务。如果想进行练习可

以依据 RocketMQ 的案例稍加改动。

4、超时询问机制

系统A除了实现正常的业务流程外,还需提供一个事务询问的接口,

供消息中间件调用。当消息中间件收到发布消息便开始计时,如果到

了超时没收到确认指令,就会主动调用系统A提供的事务询问接口询

问该系统目前的状态。该接口会返回三种结果,中间件根据三种结果

做出不同反应。

三种结果及其反应:

①A系统已经正常地完成消息的提交,向消息中间件提交了 Commit,

将该消息投递给系统B。

②A系统执行的事务失败了,这时向消息中间件提供的是 Rollback

指令,而直接把该条消息丢齐。

③A任务的处理结果还未完成,而需要继续等待。

消息询问机制和 RocketMQ 中的消息回查是相同的。

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
存储 SQL 微服务
常用的分布式事务解决方案(三)
常用的分布式事务解决方案(三)
|
2月前
|
关系型数据库 MySQL
常见分布式事务的解决方案(一)
常见分布式事务的解决方案(一)
|
2月前
|
消息中间件 中间件 关系型数据库
常用的分布式事务解决方案(四)
常用的分布式事务解决方案(四)
|
2月前
常用的分布式事务解决方案(二)
常用的分布式事务解决方案(二)
|
3月前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
3月前
|
存储 监控 数据可视化
性能监控之JMeter分布式压测轻量日志解决方案
【8月更文挑战第11天】性能监控之JMeter分布式压测轻量日志解决方案
92 0
性能监控之JMeter分布式压测轻量日志解决方案
|
4月前
|
存储 NoSQL 算法
实现分布式锁的Java解决方案
实现分布式锁的Java解决方案
|
4月前
|
存储 数据管理 数据库
现代数据库技术中的分布式一致性问题与解决方案探讨
分布式系统在现代数据库技术中扮演着重要角色,但分布式环境下的数据一致性问题始终是挑战之一。本文深入探讨了分布式一致性的核心概念、各种一致性模型的特点及其在实际应用中的优缺点,旨在为技术从业者提供全面的视角和实用的解决方案。
|
4月前
|
消息中间件 Java 中间件
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
60 0
|
4月前
|
存储 NoSQL 算法
实现分布式锁的Java解决方案
实现分布式锁的Java解决方案
下一篇
无影云桌面