分布式事务之使用MQ异步解耦的消息最终一致性方案

电商微服务架构面试核心:拆分、分布式事务、幂等与高并发治理 微服务架构是后端开发的核心技能,在电商等高并发场景中尤为关键。其本质是将单体应用按业务能力边界拆分为独立服务,通过服务间通信与数据一致性机制协同工作。分布式事务与最终一致性是微服务落地中的难点,本地消息表、事务消息、TCC等方案各有适用边界;幂等设计则通过唯一索引、状态机等手段保证接口在重复请求下的安全。缓存、限流、熔断、分布式锁等治理手段保障了系统在高并发下的稳定性与数据一致性。理解这些技术的原理与工程实践,是设计与优化电商微服务系统的基石。本文以电商实际业务为主线,剖析服务拆分、核心机制及典型面试题,帮 阅读详情

 

为什么要做成异步的并使用MQ

  • 上文已经说过,不管是2PC、3PC都没有根本解决性能问题,而如果通过MQ的事务消息来进行异步解耦,会提升系统性能。
  • 服务进行模块化拆分,便于提高系统模块重用度,使开发和维护可以并行进行,提高效率。
  • 系统扩展性更高。
  • 团队协作流程也会得到改善。

 

 

异步/分布式会出现消息一致性的问题

 

 

  1. 消息生成者发送消息
  2. MQ收到消息,将消息进行持久化,在存储中新增一条记录
  3. 返回确认消息给生成者
  4. MQ push 消息给对应的消费者,然后等待消费者返回确认消息
  5. 如果消息消费者在指定时间内成功返回确认信息,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到确认信息,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤
  6. MQ删除消息

普通消息处理存在的一致性问题

我们以订单创建为例,订单系统先创建订单(本地事务),再发送消息给下游处理;如果订单创建成功,然而消息没有发送出去,那么下游所有系统都无法感知到这个事件,会出现脏数据;

public void processOrder() {

    // 订单处理(业务操作)

    orderService.process();

    // 发送订单处理成功消息(发送消息)

    sendBizMsg ();

}

 

如果先发送订单消息,再创建订单;那么就有可能消息发送成功,但是在订单创建的时候却失败了,此时下游系统却认为这个订单已经创建,也会出现脏数据。

public void processOrder() {

    // 发送订单处理成功消息(发送消息)

    sendBizMsg ();

    // 订单处理(业务操作)

    orderService.process();

}

 

此时可能会想,我们可否将消息发送和业务处理放在同一个本地事务中来进行处理,如果业务消息发送失败,那么本地事务就回滚,这样是不是就能解决消息发送的一致性问题呢?

@Transactionnal

public void processOrder() {

    try{

        // 订单处理(业务操作)

        orderService.process();

        // 发送订单处理成功消息(发送消息)

        sendBizMsg ();

    }catch(Exception e){

        事务回滚;

    }

}

 

来分析下这种消息发送的异常情况

 

可能的情况

一致性

订单处理成功,然后突然宕机,事务未提交,消息没有发送出去

一致

订单处理成功,由于网络原因或者MQ宕机,消息没有发送出去,事务回滚

一致

订单处理成功,消息发送成功,但是MQ由于其他原因,导致消息存储失败,事务回滚

一致

订单处理成功,消息存储成功,但是MQ处理超时,从而ACK确认失败,导致发送方本地事务回滚

不一致

从上面的情况分析,我们可以看到,使用普通的处理方式,无论如何,都无法保证业务处理与消息发送两边的一致性,其根本的原因就在于:远程调用,结果最终可能为成功、失败、超时;而对于超时的情况,处理方最终的结果可能是成功,也可能是失败,调用方是无法知晓的。 为了保证两边数据的一致性,我们只能从其他地方寻找新的突破口。

 

事务消息

 

由于传统的处理方式无法解决消息生成者本地事务处理成功与消息发送成功两者的一致性问题,因此事务消息就诞生了,它实现了消息生成者本地事务与消息发送的原子性,保证了消息生成者本地事务处理成功与消息发送成功的最终一致性问题。

 

https://help.aliyun.com/document_detail/29548.html?spm=a2c4g.11186623.2.16.2204500aVkjVW2

 

  1. 事务消息与普通消息的区别就在于消息生产环节,生产者首先预发送一条消息到MQ(这也被称为发送half消息)
  2. MQ接受到消息后,先进行持久化,则存储中会新增一条状态为待发送的消息
  3. 然后返回ACK给消息生产者,此时MQ不会触发消息推送事件
  4. 生产者预发送消息成功后,执行本地事务
  5. 执行本地事务,执行完成后,发送执行结果给MQ
  6. MQ会根据结果删除或者更新消息状态为可发送
  7. 如果消息状态更新为可发送,则MQ会push消息给消费者,后面消息的消费和普通消息是一样的

注意点:由于MQ通常都会保证消息能够投递成功,因此,如果业务没有及时返回ACK结果,那么就有可能造成MQ的重复消息投递问题。因此,对于消息最终一致性的方案,消息的消费者必须要对消息的消费支持幂等,不能造成同一条消息的重复消费的情况。

异常情况

一致性

处理异常方法

消息未存储,业务操作未执行

一致

无

存储待发送消息成功,但是ACK失败,导致业务未执行(可能是MQ处理超时、网络抖动等原因)

不一致

MQ确认业务操作结果,处理消息(删除消息)

存储待发送消息成功,ACK成功,业务执行(可能成功也可能失败),但是MQ没有收到生产者业务处理的最终结果

不一致

MQ确认业务操作结果,处理消息(根据就业务处理结果,更新消息状态,如果业务执行成功,则投递消息,失败则删除消息)

业务处理成功,并且发送结果给MQ,但是MQ更新消息失败,导致消息状态依旧为待发送

不一致

同上

 

上面我们也分析了事务消息所存在的异常情况,即MQ存储了待发送的消息,但是MQ无法感知到上游处理的最终结果。对于RocketMQ而言,它的解决方案非常的简单,就是其内部实现会有一个定时任务,去轮训状态为待发送的消息,然后给producer发送check请求,而producer必须实现一个check监听器,监听器的内容通常就是去检查与之对应的本地事务是否成功(一般就是查询DB),如果成功了,则MQ会将消息设置为可发送,否则就删除消息。

 

优点

实现简单

缺点

现在目前较为主流的MQ,比如ActiveMQ、RabbitMQ、Kafka、RocketMQ等,只有RocketMQ支持事务消息。因此,如果我们希望强依赖一个MQ的事务消息来做到消息最终一致性的话,在目前的情况下,技术选型上只能去选择RocketMQ来解决。

 

常见的问题

问:如果预发送消息失败,是不是业务就不执行了?

  1. 答:是的,对于基于消息最终一致性的方案,一般都会强依赖这步,如果这个步骤无法得到保证,那么最终也 就不可能做到最终一致性了。

问:为什么要增加一个消息预发送机制,增加两次发布出去消息的重试机制,为什么不在业务成功之后,发送失败的话使用一次重试机制?

  1. 答:如果业务执行成功,再去发消息,此时如果还没来得及发消息,业务系统就已经宕机了,系统重启后,根本没有记录之前是否发送过消息,这样就会导致业务执行成功,消息最终没发出去的情况。

如果consumer消费失败,是否需要producer做回滚呢?

  1. 答:这里的事务消息,producer不会因为consumer消费失败而做回滚,采用事务消息的应用,其所追求的是高可用和最终一致性,消息消费失败的话,MQ自己会负责重推消息,直到消费成功。因此,事务消息是针对生产端而言的,而消费端,消费端的一致性是通过MQ的重试机制来完成的。

如果consumer端因为业务异常而导致回滚,那么岂不是两边最终无法保证一致性?

  1. 答:基于消息的最终一致性方案必须保证消费端在业务上的操作没障碍,它只允许系统异常的失败,不允许业务上的失败,比如在你业务上抛出个NPE之类的问题,导致你消费端执行事务失败,那就很难做到一致了。

 

基于本地消息的最终一致性

 

 

 

基于本地消息的最终一致性方案的最核心做法就是在消费者发送消息给MQ的时候,记录一条消息数据到DB,并且消息数据的发送、记录与业务的处理必须在同一个事务内完成(或者是镶嵌关系,内部异常抛出影响外部回滚),这是该方案的前提核心保障。它与普通消息处理流程的差异在于将发送的消息记录在了数据库,记录在数据库的消息数据同时记录发送状态(成功/失败),消费状态(成功/失败)。

 

异常情况

一致性

处理异常方法

业务处理失败/消息存储DB失败/消息发送失败,数据回滚

一致

无

消息发送成功。MQ存储数据成功,返回ACK失败(可能是MQ处理超时、网络抖动等原因)

不一致

业务处理回滚,消费者消费消息时查询DB记录的发送状态,如果该条消息发送状态为失败,则不进行消费,设置重试时间;如果该条消息不存在,则说明消息在生产者方已回滚,消费成功不进行业务处理

 

优点

对MQ选型没有强依赖性,实现较为简单

缺点

性能瓶颈集中在了DB/Redis或其他本地存储消息的数据库上

 

独立消息服务的最终一致性

 

 

独立消息服务最终一致性与本地消息服务最终一致性最大的差异就在于将消息的存储单独地做成了一个RPC的服务,这个过程其实就是模拟了事务消息的消息预发送过程,如果预发送消息失败,那么生产者业务就不会去执行,因此对于生产者的业务而言,它是强依赖于该消息服务的。不过好在独立消息服务支持水平扩容,因此只要部署多台,做成集群模式,就能够保证其可靠性。在消息服务中,还有一个单独地定时任务,它会定期轮训长时间处于待发送状态的消息,通过一个check补偿机制来确认该消息对应的业务是否成功,如果对应的业务处理成功,则将消息修改为可发送,然后将其投递给MQ;如果业务处理失败,则将对应的消息更新或者删除即可。因此在使用该方案时,消息生产者必须同时实现一个check服务,来供消息服务做消息的确认。对于消息的消费,该方案与上面的处理是一样,都是通过MQ自身的重发机制来保证消息被消费。

 

优点

对MQ选型无强依赖性,也没有较大的性能瓶颈

缺点

维护和开发成本高

本地消息表实现分布式事务—可靠消息最终一致性解决方案 本地消息表:这是ebay研发出的一种分布式事务解决方案,通过将消息表存储在数据库中,实现了消息的一致性。它的核心思想就将分布式事务拆分成本地事务进行处理本地消息表是利用各系统本地事务来实现分布式事务。业务系统的执行和消息均放入本地消息表中,确保本地业务执行和消息表的操作在一个事务中。不尝机制重试读取本地消息表,调用远程应用操作。需要加入重试机制、最大执行次数、报警机制。本地消息表容忍数据暂时不一致,期望数据的最终一致性。 阅读详情

相关推荐

项目工作中应用消息队列MQ

消息队列(MQ)是分布式系统中不可或缺的技术之一。对很多小伙伴来说,刚接触MQ时,可能觉得它只是个“传话工具”,但用着用着,你会发现它简直是系统的“润滑剂”。无论是解耦、削峰,还是异步任务处理,都离不开MQ的身影。下面我结合实际场景,从简单到复杂,逐一拆解MQ的10种经典使用方式,希望对你会有所帮助。消息队列不只是传递消息的工具,更是系统解耦、提升稳定性和扩展性的利器。在这10种经典场景中,每一种都能解决特定的业务痛点。希望这篇文章对你理解MQ的应用场景有帮助!

xdpcxq1029的博客 881

通过rabbitMQ消息队列实现分布式环境下的最终一致性

话不多说,直接切入正题: 2018-09-07 20:30 更 基础流程图: 上游服务接收到信息,先保存在本地消息表中,保存失败直接返回退出,保存成功则通知消息服务器new一个新的消息对象,状态为NEW,表示这个可能要发送,,通知成功(注意这里的通知这一步需要为同步模式,不然会出现这种情况,本地已经消费了,但是却没通知到,这样消息就丢失了)通知成功之后则开...

Coder_Joker的博客 joke a joker 9288

合规批量下载美国上市公司年报数据的一些经验和总结

本文总结了使用Python脚本批量下载和处理美国上市公司SEC报告的技术经验。通过CIK代码查询SEC EDGAR系统,生成特定日期和报告类型的URL,并使用Selenium和Requests库下载报告内容。流程包括数据获取、文件下载、Excel处理和多线程优化,确保高效处理几百条数据。关键技术挑战包括SEC访问限制、动态网页内容和数据完整性,解决方案包括设置合规的User-Agent、使用Selenium模拟浏览器行为以及错误日志记录。最佳实践包括模块化设计、多线程优化和严格遵守SEC合规性。该自动化流程

jyfool的博客 1636

2022年最新《谷粒商城开发教程》:1 - 构建工程篇

2022年谷粒商城最新笔记,详细教程,运行百分百通过

Laptoy的博客 3047

oracle 11.2.0.3.0 client下载,oracle64位客户端 Instant Client

oracle64位 客户端安装程序,Instant Client v11.2.0.3.0(64-bit)可以用,bo客户端需要配这个的,所以装了一个,64位操作系统中、不安装Oracle-32bit客户端,方便使用PLSQL Developer(不支持64bit位Oracle客户端)安装教程安装配置instantclient下载后,解压到D:\Oracle\instantclient_11_2(特...

weixin_42573757的博客 4516

从零构建2.4G无线通信系统:MSPM0G3507与NRF24L01的深度协同设计

本文详细介绍了基于MSPM0G3507微控制器与NRF24L01射频模块构建2.4G无线通信系统的深度协同设计方案。内容涵盖系统架构、SPI通信优化、功耗管理、抗干扰机制及中断/DMA高效利用,为工业物联网应用提供高可靠、低功耗的无线传输解决方案。

rice5的博客 821

我说分布式事务之消息最终一致性事务(一):原理及实现

来源:https://0x9.me/YgaUc在之前的文章中,我们已经学习总结了分布式事务的两种解决方案。我说分布式事务之TCC我说分布式事务之最大努力通知型事务本文我们...

程序猿DD 2465

YOLOv8n模型导出ONNX的避坑指南:解决版本差异,正确生成TensorRT/RKNN所需输出节点

本文详细介绍了YOLOv8n模型导出ONNX格式的实战避坑指南,涵盖版本差异处理、代码修改技巧及TensorRT/RKNN部署优化方案。针对不同推理框架需求,提供输出节点生成、动态轴处理和后处理划分等核心问题的解决方案,帮助开发者高效完成模型部署。

weixin_33247358的博客 357

rabbitmq ,mq可靠消息最终一致性方案的核心流程

①上游服务投递消息 如果要实现可靠消息最终一致性方案,一般你可以自己写一个可靠消息服务,实现一些业务逻辑。 首先,上游服务需要发送一条消息给可靠消息服务。这条消息说白了,你可以认为是对下游服务一个接口的调用,里面包含了对应的一些请求参数。 然后,可靠消息服务就得把这条消息存储到自己的数据库里去,状态为“待确认”。 接着,上游服务就可以执行自己本地的数据库操作,根据自己的执行结果,再次调用可靠消息服...

lixiangfei4的博客 1241

YOLOv11 改进 - 即插即用 | PST金字塔稀疏Transformer:粗粒度到细粒度推理优化特征提取,提升复杂场景适应性

本文介绍了金字塔稀疏 Transformer(PST)与 YOLOv11 的结合。主流基于注意力的特征融合方法计算复杂度高、实现难度大,作者提出 PST 模块,融合粗到细令牌选择与共享注意力参数机制,在保留空间细节的同时降低计算量。该模块通过层级化注意力机制、动态令牌选择与参数共享,实现高效多尺度特征融合

魔改工程师的博客 830

SA8295P QNX主机上电启动流程分析

嵌入式系统的启动过程对于确保系统正常运行至关重要。本文将详细分析SA8295P芯片在QNX主机上的上电启动流程,并提供相应的源代码示例。嵌入式系统的启动过程对于确保系统正常运行至关重要。本文将详细分析SA8295P芯片在QNX主机上的上电启动流程,并提供相应的源代码示例。以下是一个SA8295P QNX主机上电启动流程分析。

CodeMaven的博客 1231

如何保证mq的有序性_在分布式系统中,如何实现最终一致性?多种设计方案深入分析。...

本文参考《持续演进的Cloud Native云原生架构下微服务最佳实践》一书整理而成,分析了在分布式系统中,如何实现最终一致性。如何实现最终一致性?在分布式系统中,实现强一致性并不容易。即使2PC、3PC阶段提交,也无法保证绝对的强一致性。我们也不能因为极小的不一致性概率,导致系统性能低下,或者扩展性受到影响,并且架构也变得极其复杂。因此,在2PC/3PC提交缺乏大规模应用的情况下,最终一致性是一...

weixin_31765677的博客 340

Claude Code 分布式并行开发最佳实践:1中枢+10Worker跨多Git仓库全流程落地

本文介绍了一套基于Claude Code和Git Worktree的分布式并行开发方案,解决多仓库、微服务开发中的核心痛点。方案采用"1个决策中枢+10个并行Worker"架构,中枢负责任务拆解和调度,每个Worker绑定独立仓库实现完全隔离开发。关键优势包括:任务并行效率提升10倍、跨仓库依赖自动编排、版本统一管理、零第三方依赖。文章详细提供了环境准备、架构设计、中枢搭建和初始化脚本等全流程落地指南,特别适合多仓库协同的全栈开发场景。

AI天才研究院 244

【架构实战】本地消息表:最终一致性的低成本实现方案

本地消息表是一种基于数据库事务保证消息可靠投递的最终一致性方案。把业务操作和消息记录放在同一个数据库事务里,利用 ACID 特性保证原子性。│ 本地消息表方案 ││ ││ │ 业务服务 │ ││ │ │ ││ │ ┌─────┐ │ 同一个事务 ││ │ │业务表│◄─┼──┤ INSERT INTO 业务表 │ ││ │ └─────┘ │ │ INSERT INTO 消息表 │ ││ │ │消息表│ │ ┌─────────────────┐ │。

分享技术应用、实践场景等,评论区开放技术难题讨论,共同成长进步。 386

外骨骼机器人(二):自适应振荡器

振荡器是一种数学工具,可以用于实时跟踪、预测类周期信号的频率、相位、幅值等,而助行外骨骼机器人需要自动适应人体的行走频率、幅度,两者相结合,就能使助行外骨骼机器人拥有更舒适、更自然的行走步态。 ......

行者无疆的博客 4264

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

预订接口 V2 优化:使用本地消息表保证订单生成、库存扣减的一致性

🎯 本文介绍了一种优化预订接口的方法,通过引入本地消息表解决分布式事务中的最终一致性问题。原先的实现是在一个事务中同时扣减库存和创建订单,容易因网络不稳定导致数据不一致。改进后的方法将业务操作和消息发送封装在本地事务中,并利用MQ进行异步解耦,确保了即使在网络故障时也能保证系统的数据一致性。此外,还设计了定时任务重试机制以及幂等性保障措施来进一步确保消息被成功处理,从而实现了高效可靠的分布式事务处理。说明。

varyall的专栏 123

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

消息队列-通用知识

1. 消息队列 1.1 优缺点 优点/使用场景: 解耦。生产消息后直接给MQ,不用关心其他事务,监听返回消息就行。 异步。异步执行,提高吞吐量。发送者将消息给MQ后,不需要同步等待处理完毕,而是可以进行其它操作。 削峰。请求放在MQ里,Server根据处理能力处理消息,缓解服务器压力,不至于GG。 缺点: 系统可用性降低。MQ挂了,整个系统通信GG。 系统复杂度增加。加入MQ,引出一致性、传...

口木西成 441

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

分布式事务解决方案总结:本地消息异步确认、可靠消息最终一致性、最大努力通知

本文从实现原理、技术细节和适用场景三个维度对比了三种主流分布式事务解决方案。本地消息异步确认方案通过"本地事务+消息表"实现最终一致性,适合订单与库存解耦场景;可靠消息最终一致性基于消息队列的"半消息"机制,适用于支付等强一致性场景;最大努力通知方案采用"重试+补偿"机制,多用于第三方回调等非核心链路。文章还提供了详细的方案对比表格,指导读者根据一致性强度、实现复杂度和具体业务需求进行选型,如金融交易优先选可靠消息方案,高并发场景可考虑本地消息表方

码到三十五 2784

RabbitMQ(一):消息队列MQ

MQ全称是Message Queue,直译过来叫做消息队列。MQ本质上是一个队列,遵循先进先出的原则,而队列存放内容为message,主要是作为分布式应用之间实现异步通信的方式。是一种跨进程的通信机制,用于上下游传递消息。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。现在主流的消息队列有:ActiveMQ、RabbitMQ,Kafka,RocketMQ等。

dl_11的博客 2243

腾讯二面:如何保证MQ消息不丢失?重复消费如何保证幂等,本地消息表配合MQ实现最终一致性?

腾讯二面记录:针对MQ消息可靠性问题,主要考察两方面:1)防止消息丢失,需通过生产者确认、Broker持久化、消费者确认机制实现端到端保障;2)处理重复消费,可通过业务唯一标识、数据库乐观锁或Redis原子操作实现幂等控制。面试重点在于系统架构设计中对消息可靠性与一致性的解决方案。

lfeishumomol的博客 798

分布式事务解决方案—本地消息表

本地消息表方案通过结合本地事务与异步消息,在保证可靠性的同时实现系统解耦,是分布式事务中平衡复杂度与一致性的优选方案。实际应用中需结合业务场景,合理设计消息表结构、重试策略及补偿机制,以确保系统的最终一致性和高可用性。(1)本地消息表通过在数据库中维护一张专门的消息表来管理与外部系统的交互状态更新,由于消息表的写入是与业务操作同在一个本地事务中完成的,天然具有同时成功和同时失败的特性。

jakeswang的博客 2131

MQ 常见使用场景:从异步解耦到任务分发,看消息队列如何撑起高并发系统

消息队列(MQ)在分布式系统中发挥关键作用,主要解决7大核心场景:1)异步解耦,分离核心业务与辅助功能;2)流量削峰,应对双十一等突发流量;3)延迟消息,精准处理定时任务;4)分布式事务,实现最终一致性;5)日志收集,高效处理海量数据;6)任务分发,并行处理亿级任务;7)高性能Job服务,分离调度与执行。MQ通过"解耦+异步+缓冲"机制,显著提升系统性能、扩展性和可靠性,成为高并发系统的必备基础设施。

Java开发者,专注后端技术分享,深耕框架实战与架构优化,持续输出优质技术干货。 563

消息队列(MQ)

定义消息队列:一般我们会简称它为MQ(Message Queue)。Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯。他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的。这两种协议很难实现双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯

m0_52012606的博客 2934

消息队列(MQ)到底能干什么?

一、什么是MQ? MQ全称为Message Queue,也就是消息队列,是应用程序和应用程序之间的通信方法。 二、MQ能用来干什么? 能用来干什么,也就是MQ的适用场景。 在微服务盛行的当下,MQ被使用的也是越来越多,一般常用来进行业务异步解耦、解耦微服务、流量削峰填谷、消息分发、分布式事务的数据一致性,我们分别来看一下。 1、业务异步解耦 在正常业务流程中,比较耗时而且不需要即时返回结果的操作。将这些操作可以做为异步处理,这样可以大大的加快请求的响应时间。 最常见的场景就是用户注册之后,需要发送注册短信、

hzj_java的博客 5057

RabbitMQ - 可靠消息最终一致性:事务消息方案

RabbitMQ 可靠消息最终一致性方案 🐰 核心摘要 本文探讨基于RabbitMQ实现分布式系统最终一致性的解决方案。针对跨服务数据一致性问题,传统强一致性方案存在性能瓶颈,而最终一致性通过异步消息机制提供了更优解。 关键实现要点: 消息可靠性保障:使用Confirm模式确保消息投递,结合持久化队列和手动ACK机制 事务消息设计:通过本地事务表记录消息状态,实现"业务操作+消息记录"的原子性 异常处理机制:引入死信队列处理失败消息,配合补偿任务实现可靠重试 方案优势: 解耦服务调用

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Go 分布式事务方案对比:Saga、TCC 和消息最终一致性

分布式事务选型决策:一致性和性能始终是权衡。Saga 适合长业务流程的最终一致(补偿兜底),TCC 适合资金交易场景的强一致(Try-Confirm-Cancel 两阶段),消息最终一致性适合异步解耦场景(Outbox + 幂等消费)。实施建议:从消息最终一致性开始(最简单),满足不了再上 Saga,TCC 只在真正需要强一致性的金融场景使用。

好代码自己会说话,烂代码才需要注释来圆谎 4814
上一篇: SpringBoot集成Redis和配置Redis做缓存
下一篇: JVM入门(Class格式及类加载)
打破沉默
博客等级 码龄11年 11粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值