分布式事务的四种解决方案——本地消息表(异步确保)

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

本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。

  1. 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
  2. 之后将本地消息表中的消息转发到 Kafka 等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
  3. 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。

在这里插入图片描述
如上图示:
message有以下4种状态
status 0:初始状态
status 1:publisher收到broker 确认消息后的状态
status 2:消息被consumer成功消费后的状态
status 3:异常状态,需人工跟进处理

步骤如下:
step 1:message 入库(存进db),初始 status 为 0
step 2:publisher发送message到 broker
step 3:broker收到消息后返回 确认消息 给publisher
step 4:publisher收到确认消息后,更新 message 的 status 为 1
step 5:consumer从broker获取消息并执行
step 6:consumer执行成功后返回确认消息给broker
step 7:consumer执行成功后将message 的 status 更新为 2
step 8:定时任务(cronjob)扫描db中status为0的message
step 9:cronjob将status为0的message重新发送到publisher,重复前面的 step2 ~ step7
step 10:为避免cronjob无限重复发送message而拖垮服务,
message发送次数大于3时,转为异常message,即status置为3
实际应用场景中, 可能由于网络原因, 或者消息未被持久化MQ就宕机了, 使得投递确认的回调方法ConfirmCallback没有被执行, 从而导致数据库该消息状态一直是投递中的状态, 此时就需要进行消息重投, 即使也许消息已经被消费了。
定时任务只是保证消息100%投递成功, 而多次投递的消费幂等性需要消费端自己保证。
消息100%投递
消息持久化 + 定时任务

总结:

  1. step2 这一步骤,有可能因为网络故障或者broker宕机而导致message丢失,
    因此需要消息补偿机制(step8 ~ step10),由定时任务(cronjob)实现

  2. 上面方案如果在step3 or step4发生错误,可能会发生broker已收到消息,但status没能更新为1情况
    此时就会进入消息补偿环节,导致broker中存在2条相同消息,造成重复投递问题
    而在业务上,比如支付业务上,是不允许消息重复消费消息的。
    此时就需要在 consumer 端来处理这问题,即问题1《如何避免消息重复消费》

  3. 一条message,从创建到消费完毕,共经过 0,1,2 这三种消息状态,
    需要进行3次db操作。而在实际业务中,造成服务瓶颈的往往是db操作,
    3次耗时有点多,有没有优化方法?有的,看下面的 消息可靠投递方案2

在这里插入图片描述
如上图示:
‘upstreamService’:上游服务,即消息生产者(下面简称’uss’)
‘downstreamService’:下游服务,即消息消费者(下面简称’dss’)
‘callbackService’:回调服务,确认消息已经被成功消费并更新入库消息(下面简称’cbs’)

步骤如下:
step 1:uss入库消息后,第一次发送消息给 broker

step 2:uss第二次发送消息,第二条消息属于延迟检查消息。
检查第一条消息是否已经被成功消费,两次投递之间需要间隔时间,比如5分钟

step 3:dss从broker获取消息

step 4:dss消费消息后发送confirm消息,这里的confirm不是正常的ack响应,
而是重新生成一条消息,发送到broker中

step5 5:cbs监听dss发送的confirm消息,如果收到confirm消息,
说明消息已经被成功消费,更新消息的状态为成功消费

step 6:5分钟之后,cbs收到了uss发送的延迟检查消息,此时会去db中检查消息是否已经被成功消费。
如果成功,不需要做任何处理。
如果失败,cbs会发起rpc服务通知uss该条消息投递失败,需要重新发送。
uss收到rpc通知后会重新发送该消息,重走step1 ~ step5的流程

总结:

  1. 方案2的step2和step6这两步骤,实现了消息补偿机制

  2. 方案2消息的status经过 0(初始),1(成功消费) 两种状态。只进行了2次db操作
    相对前面的方案1 (3次db操作),性能上提升了 1/3,能支持更高的并发量。

  3. cbs调起rpc通知这一步,如果出现故障,会导致消息的丢失,可靠性并没有方案1高。
    但在实际业务中,有时并不需要100%的消息投递,可能是要支持更高的并发量,此时可以采用方案2。
    另外如果真需要100%的消息投递,可以在方案2的基础上机上方案1的cronjob补偿消息,提高消息投递的可靠性
    思考:这种方案和上一种方案的区别是什么呢?
    如上图示:
    ‘upstreamService’:上游服务,即消息生产者(下面简称’uss’)
    ‘downstreamService’:下游服务,即消息消费者(下面简称’dss’)
    ‘callbackService’:回调服务,确认消息已经被成功消费并更新入库消息(下面简称’cbs’)

步骤如下:
step 1:uss入库消息后,第一次发送消息给 broker

step 2:uss第二次发送消息,第二条消息属于延迟检查消息。
检查第一条消息是否已经被成功消费,两次投递之间需要间隔时间,比如5分钟

step 3:dss从broker获取消息

step 4:dss消费消息后发送confirm消息,这里的confirm不是正常的ack响应,
而是重新生成一条消息,发送到broker中

step5 5:cbs监听dss发送的confirm消息,如果收到confirm消息,
说明消息已经被成功消费,更新消息的状态为成功消费

step 6:5分钟之后,cbs收到了uss发送的延迟检查消息,此时会去db中检查消息是否已经被成功消费。
如果成功,不需要做任何处理。
如果失败,cbs会发起rpc服务通知uss该条消息投递失败,需要重新发送。
uss收到rpc通知后会重新发送该消息,重走step1 ~ step5的流程

总结:

  1. 方案2的step2和step6这两步骤,实现了消息补偿机制

  2. 方案2消息的status经过 0(初始),1(成功消费) 两种状态。只进行了2次db操作
    相对前面的方案1 (3次db操作),性能上提升了 1/3,能支持更高的并发量。

  3. cbs调起rpc通知这一步,如果出现故障,会导致消息的丢失,可靠性并没有方案1高。
    但在实际业务中,有时并不需要100%的消息投递,可能是要支持更高的并发量,此时可以采用方案2。
    另外如果真需要100%的消息投递,可以在方案2的基础上机上方案1的cronjob补偿消息,提高消息投递的可靠性
    思考:这种方案和上一种方案的区别是什么呢?
    对于主业务流程来说,他只有一条线,就是业务数据落库,然后发送消息到服务器,少了消息库的插入。这个方案把消息库的操作都给了回调服务,而回调服务是一种补偿服务,完全可以异步去处理,不影响主业务进程,性能就提高了。

基于本地事务表+MQ实现分布式事务 分布式事务解决方案有许多比如二阶段提交、TCC、最大努力通知、Saga事务等,本文介绍本地消息表+MQ这种方式解决分布式事务消息最总一致性问题。目前利用本地消息表+MQ方案实现最终消息一致性的比较多,它的核心思想是,将分布式事务拆分成本地事务进行处理,不同事务之间通过消息表和MQ通信,最后通过定时任务扫描失败的数据进行重试,当在有效重试次数限制内,再次重试回调失败的数据,最终实现消息重复发送,达到一致性。本地消息表实现最终一致性。将rocketmq-dashboard导入到idea中,在idea编译启动。 阅读详情

相关推荐

本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案

最终,通过引入一个中间的Rocketmq承担本地消息表的职责,除了解决事务的一致性外,同样可以解决消息的丢失与幂等性问题,一举多得。而且从业务的健壮性与数据一致性来看,一般都会增加一个补偿机制, 实现数据的 最终一致性。这也是BASE理论所支持的。如何设计 10Wqps高并发分布式事务?如果能讲 到尼恩答案 的 水平 , 面试官一定口水直流, 大厂 offer 就到手啦。只要按照上面的 尼恩团队梳理的 方案去作答, 你的答案不是 100分,而是 120分。面试官一定是 心满意足, 五体投地。

架构师尼恩 2829

分布式事务-本地消息表

需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文本、数据库或消息队列,再通过业务规则自动或人工发起重试。

3129

分布式事务:本地消息表

本地消息表是一种基于数据库的分布式事务解决方案,通过将分布式事务拆分为本地事务和消息事件来实现最终一致性。其核心流程包括:事务发起方完成本地业务操作并存储消息到数据库;定时任务扫描并发送未处理消息;接收方处理消息后发送确认。该方案优点包括简化编程模型、提高系统吞吐量、保证可靠性,但存在实时性不高、开发成本较高等缺点。适用于电商订单、资金转账等对最终一致性要求高但对实时性要求不高的场景,实现时需考虑消息表设计、幂等处理及异常重试机制。

Quan 1323

4.消息100%投递的两种方案

前言:消息中间件 是用来 客户端 与 客户端之间通信的,那么就存在以下两个问题: 如何避免消息重复消费(针对consumer) 如何保证消息的可靠性投递(针对publisher) 对于问题1,看《防止消息重复消费》一文 下面讲问题2:保证消息的可靠性投递 上图是消息投递的整个流程,熟悉该流程有助于该文章的理解 要保证消息的可靠性投递,那么应满足以下几个条件: 1. message成功发出去 2. broker节点成功收到message 3. publisher成功收到broker节点的确认应答 4

哥斯拉啊啊啊哦的博客 798

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 981

告别混乱!在Unity中为Best MQTT v3设计清晰的服务层:配置、连接、订阅发布模块拆分指南

本文详细介绍了如何在Unity中使用Best MQTT v3插件构建清晰的服务层架构,包括配置管理、连接服务、订阅管理和发布服务的模块化拆分。通过解耦设计、事件驱动和接口抽象,提升代码可维护性和可测试性,适用于物联网和实时通信开发场景。

weixin_30576827的博客 357

分布式事务的四种解决方案

分布式事务的四种解决方案 简述 分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。 例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。 解决方案 在分布式系统中,要实现分布式事务,无外乎那几种解决方案。 一、两阶段提交(2PC) 两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些...

Arvin_Mr的博客 367

避开生产计划大坑:不懂MPS和MRP的区别,你的SAP PP模块白学了

本文深入解析SAP PP模块中MPS(主生产计划)与MRP(物料需求计划)的核心区别,揭示如何通过正确配置避免生产计划中的常见陷阱。文章详细探讨了MPS的三大缓冲特性和动态平衡算法,帮助企业提升生产计划稳定性,优化资源配置,避免生产线波动。

weixin_29268267的博客 401

分布式事务分为哪几种_分布式事务的四种解决方案

简述分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。解决方案在分布式系统中,要实现分布式事务,无外乎那几种解决方案。一、两阶段提交(2PC)两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。...

weixin_39594103的博客 193

Autodesk全家桶怎么选?AutoCAD、Revit、Fusion 360等7款软件超全对比指南

本文深入对比了Autodesk旗下七款核心软件(AutoCAD、Revit、Inventor、Fusion 360、Maya、3ds Max、Forge)的核心定位与适用场景。针对建筑、制造、创意设计等不同专业需求,提供精准的选型指南,帮助用户根据自身工作流(如二维绘图、BIM协同、产品开发、影视动画)选择最匹配的工具,避免资源浪费并提升效率。

stone的博客 434

R语言机器学习算法实战系列(十五)随机森林生存预后模型+SHAP值 (Random Survival Forest + SHAP)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。。并且增加了SHAP值评估特征重要性

专注生信领域 2621

java分布式 mq_Java分布式事务的四种解决方案

原标题:Java分布式事务的四种解决方案简述分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。解决方案在分布式系统中,要实现分布式事务,无外乎那几种解决方案。一、两阶段提交(2PC)两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这...

weixin_42303282的博客 481

【XCharts插件】3-1、制作图表及代码生成图表(v1.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录OK,这是v1.0版本的XCharts插件的创建图表,代码生成图表的教程。可能有人要问了,既然都更新到v3.0了,还写啥v1.0教程呢。因为有些项目就是用v1.0去制作图表了,也没有太多的精力去更新插件,所以就一直用的v1.0,而且v1.0已经能实现大部分的图标样式了,所以,博主还是单独写了一篇文章来介绍v1.0的功能。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1293

分布式事务-解决方案

一、先说说事物的四个特点:ACID*  A原子性:ABC要么都成功,要么都失败*  C一致性:操作执行前后,数据要求一致,比如,AB账号的钱加起来是500,A给B转账50,不管中间过程怎么操作,最终要求AB的钱加起来还是500*  I隔离性:ABC都在干活,要求他们之间互不干扰,即隔离的情况下并发执行*  D持久性:事务一旦提交成功,那么更新到数据库中的数据是持久存在的二、分布式解决方案:遵循ba...

qq_23242287的博客 245

【论文复现】水下单光子激光雷达设计 Sequential Multimodal Underwater Single

针对对慢速小水下目标进行远距离、高分辨率重建的需求,单光子激光雷达(LiDAR)目标重建技术的研究正在进行。本文报告了一种基于时空序列融合的顺序多模态水下单光子 LiDAR 自适应目标重建算法,该算法具有强大的信息提取和噪声过滤能力,能够从复杂的回波光子计数和空间像素关系中重建目标的深度和反射强度信息。该方法包括三个步骤:数据预处理、序列优化极值推断滤波以及图像优化协同变分策略,以实现复杂水下环境下的高质量目标重建。

u012133341的博客 292

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

jakeswang的博客 2131

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: HTTPS传输过程
下一篇: 分布式基本理论
huapro.vip
博客等级 码龄15年 36粉丝 73原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值