代码编织梦想

基于可靠消息服务的方案是通过消息中间件保证上下游应用数据操作的一致性。假设有A和B两个系统,分别可以处理任务A和任务B。此时存在一个业务流程,需要将任务A和任务B在同一个事务中处理。就可以使用消息中间件来实现这种分布式事务。
在这里插入图片描述

第一步:消息由系统A投递到中间件

  1. 在系统A处理任务A前,首先向消息中间件发送一条消息
  2. 消息中间件收到后将该条消息持久化,但并不投递,此时下游系统B仍然不知道该条消息的存在。持久化成功后,向A回复一个确认应答
  3. 系统A收到确认应答后,则可以开始处理任务A
  4. 任务A处理完成后,向消息中间件发送Commit。该请求发送完成后,对系统A而言,该事务的处理过程就结束了
  5. 如果消息中间件收到Commit,则向B系统投递消息,从而触发任务B的执行;
  6. 当任务B执行完成后,系统B向消息中间件返回一个确认应答,此时,这个分布式事务完成

如果任务A处理失败,那么需要进入回滚流程

  • 若系统A在处理任务A时失败,那么就会向消息中间件发送Rollback请求。系统A发完之后便可以认为回滚已经完成,它便可以去做其他的事情
  • 消息中间件收到回滚请求后,直接将该消息丢弃不投递给系统B

超时询问机制

上面所介绍的Commit和Rollback都属于理想情况,但在实际系统中,Commit和Rollback指令都有可能在传输途中丢失。那么当出现这种情况的时候,消息中间件是如何保证数据一致性呢?——答案就是超时询问机制。
系统A除了实现正常的业务流程外,还需要提供一个事务询问的接口,供消息中间件调用。当消息中间件收到发布的事务型消息后便开始计时,如果到了超时没收到确认指令,也没收到系统A发来的Commit或Rollback指令的话,就会主动调用系统A提供的事务询问接口询问该系统目前的状态。该接口会返回三种结果,中间件根据这三种的结果做出不同反应:

  • 提交:将该消息投递给系统B
  • 回滚:直接将这条消息丢弃
  • 处理中:继续等待

第二步:消息由中间件投递到系统B

消息中间件向下游系统投递完消息后便进入阻塞等待状态,下游系统立即进行任务的处理,任务处理完成后便向消息中间件返回应答。

  • 如果消息中间件收到确认应答后便认为该事务处理完毕
  • 如果消息中间件在等待确认应答超时之后会重新投递,直到下游消费者返回消费成功响应为止。一般消息中间件可以设置消息重试的次数和时间间隔,如果最终还是不能成功投递,则需要人工干预。这里之所以使用人工干预,而不是使用让A系统回滚,主要是考虑到整个系统设计的复杂度问题。

投递过程的可靠性保证

我们知道当上游系统A发出commit请求之后认为事务已经完成,便可以处理其他的任务了;那么消息中间件是怎么保证消息一定会被下游系统B成功消费呢?这是使用消息中间件投递过程的可靠性来保证的

消息中间件向系统B投递完消息后便进入阻塞等待状态,如果消息在传递过程中丢失或者消息的确认应答在返回途中丢失,那么消息中间件在等待超时后会重新投递直到消息被系统B成功消费为止

之所以是重新投递而不是回滚,这就涉及到整套分布式事务系统的实现成本问题。如果回滚的话,系统A就要提供回滚接口,这增加了开发成本,业务系统的复杂度也会随之提高

异步与同步

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

上游系统A向消息中间件提交完消息后便可以去做别的事情。然而消息中间件将消息投递给下游系统B后,它会阻塞等待直到下游系统返回B确认应答。
之所以这么设计:

  • 首先:上游系统和消息中间件之间采用异步通信是为了提高系统并发度。业务系统直接和用户打交道,用户体验尤为重要,因此这种异步通信方式能够极大程度地降低用户等待时间;
  • 其次:下游系统与消息中间件采用同步虽然降低系统并发度,但实现成本较低。在对并发度要求不是很高或者服务器资源较为充裕的情况下,我们可以选择使用同步来降低系统的复杂度
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lianghecai52171314/article/details/128858562

rabbitmq 系列之分布式事务处理-最终一致性-springboot实现_codem91的博客-爱代码爱编程

  目录   分布式事务应用场景: 如何使用RabbitMQ 解决分布式事务-最终一致性: 实现场景:用户下单service - 扣减用户积分 service 结合Springboot 处理分布式事务-为减少篇幅,只列出主要几块代码,详见文末源码链接: maven-parent . pom.xml 以下是Maven-module.order

消息中间件实现分布式事务_斯巴达xp的博客-爱代码爱编程_消息中间件分布式事务

理论基础 什么是分布式事务 传统的事务是基于单数据库的本地事务,简单的来说,分布式事务就是实现跨数据库的事务支持 CAP理论 CAP理论表面在分布式系统中,最多只能满足C,A,P中的两个 C:一致性A:可用性P:分区容错性:一个服务失效,可以有其他服务来代替他的工作 既然最多只能选择两个,那选择哪两个比较合适呢?对于一个分布式系统来说,可用性和分

rabbitmq消息可靠性投递及分布式事务最终一致性实现_forever_and_ever的博客-爱代码爱编程

RabbitMQ消息可靠性投递就是保证消息生产者能够将消息百分百投递到RabbitMQ服务器,并在传递过程中不丢失。然而在生产环境中由于网络中断、网络不稳定等原因导致消息在投递过程中丢失,这或许会造成极大的损失。 消息投递过程: 处理任务A成功但由于网络原因消息在投递过程中丢在,会造成我们系统的不一致,以转账为例A银行某用户向B银行某用户转账,A系

分布式事务,基于MQ实现最终一致性分布式事务-爱代码爱编程

什么是分布式事务 传统的事务是基于项目耦合并且是单数据库的本地事务,简单的来说,分布式事务就是实现跨服务器和数据库的事务支持 CAP 定理,又被叫作布鲁尔定理。对于设计分布式系统(不仅仅是分布式事务),CAP 就是你的入门理论。 C (一致性):对某个指定的客户端来说,读操作能返回最新的写操作。 对于数据分布在不同节点上的数据来说,如果在某个节点更新了

分布式事务-基于可靠消息的最终一致性实现-爱代码爱编程

CAP与BASE 我们都知道,传统数据库事务具有ACID的特性,但在分布式环境下,追求强一致性在大多数情况下无法满足高性能需求。 分布式系统的CAP理论告诉我们,一致性、可用性、分区容忍性无法同时满足,最多只能满足其他两项。CAP理论描述如下: 一致性(Consistency):所有节点在同一时间读到同样的数据;可用性(Availability):无论

分布式事务实现方案——MQ最终一致性(RocketMQ)-爱代码爱编程

什么是可靠消息最终一致性事务     可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能 够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。 此方案是利用消息中间件完成,如下图:     事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件

最终一致性+java实现_分布式事务方案 - 最终一致性-爱代码爱编程

在分布式时代,分库分表是很常见的,微服务系统中,各个系统通常使用独立的数据库,所以,事务很难靠数据库本身保证,只能靠业务系统来解决。 例如支付宝中的余额宝、花呗,具体不清楚,但猜测应该就是2个服务,不是同一个数据库,我们还花呗的时候通常都是从余额宝中扣除的,这就是分布式事务,一个系统中扣减钱,一个系统中增加钱。 下面我们分析下最终一致性的实现方案,

分布式事务的一致性-爱代码爱编程

一、事务 数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。 事务的四大特性:ACID (原子性,一致性,隔离性,持久性) 1.1 原子性 原子性是我们对事务最直观的理解

分布式事务(四):分布式事务解决方案之可靠消息最终一致性-爱代码爱编程

什么是可靠消息最终一致性 可靠消息最终一致性方案是指当事务发起方执行完本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一直。 此方案利用消息中间件完成,如下图: 事务发起方(消息生产方)将消息发送给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件

分布式事务解决方案二:消息队列实现最终一致性-爱代码爱编程

1、可靠消息实现最终一致性 在前面我们学习过CAP理论,知道我们一般情况下会保证P和A,舍弃C,保证最终一致性。分布式事务 使用消息队列实现最终一致性的核心就是将分布式事务拆分成多个本地事务,然后通过网络由消息队列协调完成所有的事务,实现最终一致性。 这个方案相信大家都很容易理解,但是也将面临不少问题:1.消息发送方执行本地事务与发送消息的原子性问题,

分布式事务-可靠消息最终一致性解决方案_融极的博客-爱代码爱编程

概述 什么是可靠消息最终一致性事务 可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。 此方案是利用消息中间件完成,如下图: 事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息

分布式事务 :可靠消息最终一致性方案_90后小伙追梦之路的博客-爱代码爱编程

事务想必大家并不陌生,比如经常被人提起的ACID,但是为了后续的分布式事务的内容,我们先来聊聊 ACID,然后再介绍下什么是分布式事务,最后着重讲下基于可靠消息的分布式事务解决方案。 什么是事务 严格意义上的事务应该是具备原子性、一致性、隔离性和持久性,简称 ACID。 原子性(Atomicity),可以理解为一个事务内的所有操作要么都执