分布式事务之使用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

图形学基础|屏幕空间反射(SSR)

图形学基础|屏幕空间反射(SSR) 文章目录图形学基础|屏幕空间反射(SSR)一、前言二、反射技术概述2.1 环境贴图反射2.2 IBL反射2.3 平面反射(Planar Reflections)2.4 屏幕空间反射(Screen Space Reflection)2.4.1 SSR的基本原理2.4.2 SSR的优缺点三、SSR(Screen-Space Reflection)实现3.1 Efficient GPU Screen-Space Ray Tracing3.1.1 2D Raymarching v

【黑键】 3万+

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

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

Laptoy的博客 3047

window下迁移SVN仓库到新的windows服务器

window下迁移SVN仓库到新的windows服务器

Bertram的博客 4691

腾讯开源CubeSandbox:为Agent打造可随时丢弃的安全沙箱环境

在人工智能与自动化技术快速发展的今天,智能体(Agent)在执行复杂任务时往往需要独立、完整的计算环境,但环境失控带来的安全风险一直是落地瓶颈。为解决这一痛点,可丢弃式沙箱技术应运而生。它通过轻量虚拟化原理实现环境秒级重建,并严格隔离宿主资源,即使Agent执行了恶意或误操作,也不会波及其他系统。这种技术价值在于平衡了灵活性与安全性,使开发者敢于赋予Agent更多自主操作权限。目前,这类技术已广泛应用于AI编程、自动化测试、数字员工、恶意代码分析等真实场景,成为Agent可靠运行的基石。腾讯开源的CubeS

weixin_42539414的博客 254

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

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

程序猿DD 2465

FOC电机控制实战:增量式编码器零位校准的5个关键步骤(附STM32代码)

本文详细解析了FOC电机控制中增量式编码器零位校准的5个关键步骤,包括电角度锁定、定时器计数清零、机械偏移角补偿等,并提供了STM32平台的实战代码。通过精准的零位校准,可显著提升电机控制系统的精度和稳定性,适用于工业伺服和机器人关节等高精度场景。

rum55的博客 618

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

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

lixiangfei4的博客 1241

KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解

在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩

weixin_42519985的博客 251

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

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

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

weixin_31765677的博客 340

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

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

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

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

【音视频处理】MP4、FLV、HLS适用范围,在线视频播放哪个更好

本期我们讨论在线点播的视频格式,对比这些视频格式的优劣以及原因 1、封装格式的作用 2、MP4 3、FLV 4、HLS

池鱼 - YiiGaa 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

varyall的专栏 123

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

消息队列-通用知识

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

口木西成 441

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

码到三十五 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、付费专栏及课程。

余额充值