您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
基于RabbitMQ消息队列的分布式事务解决方案
 
作者:javaedge
   次浏览      
 2020-9-8 
 
编辑推荐:
本文介绍分为两点1.Rabbitmg用于解决分布式事务必须掌握的5个核心概念 一款分布式消息中间件,基于erlang语言开发, 具备语言级别的高并发处理能力。2、分布式事务问题 分布式事务是一个业务问题,不能脱离具体的场景。
来自于阿里云,,由火龙果软件Anna编辑、推荐。

1 极速了解MQ

介绍Rabbitmg用于解决分布式事务必须掌握的5个核心概念

一款分布式消息中间件,基于erlang语言开发, 具备语言级别的高并发处理能力。和Spring框架是同一家公司。

支持持久化、高可用

核心5个概念:

1.Queue: 真正存储数据的地方

2.Exchange: 接收请求,转存数据

3.Bind: 收到请求后存储到哪里

4.消息生产者:发送数据的应用

5.消息消费者: 取出数据处理的应用

2、分布式事务问题

分布式事务是一个业务问题,不能脱离具体的场景。

2.1 分布式事务的几种解决方案

● 基于数据库XA/ JTA协议的方式

需要数据库厂商支持; JAVA组件有atomikos等

● 异步校对数据的方式

支付宝、微信支付主动查询支付状态、对账单的形式;

● 基于可靠消息(MQ)的解决方案

异步场景;通用性较强;拓展性较高

● TCC编程式解决方案

严选、阿里、蚂蚁金服自己封装的DTX

本文目标:针对所有人群,学会基于可靠消息来解决分布式事务问题。

分布式事务的解决方案,业务针对性很强,重要的是思路,而不是照搬

美团点评系统架构

2.2 多系统间的分布式事务问题

用户下单生成订单

需要传递订单数据,由此产生两个事务一致性问题

错误的案例

当接口调用失败时,订单系统事务回滚,提示用户操作失败

误以为这样的接口调用写法,就不会有分布式事务问题

接口调用成功或者失败,都会产生分布式事务问题:

接口调用成功,订单系统数据库事务提交失败,运单系统没有回滚,产生数据

接口调用超时,订单系统数据库事务回滚,运单系统接口继续执行,产生数据

上述两种情况,都会导致数据不一致的问题

3、实现分布式事务 - 五步法

通过MQ解决分布式事务的5个步骤, 以及分布式事务处理中要注意的地方

之前都是订单系统发送HTTP请求运单系统的接口,出问题了!

因此我们考虑发消息给MQ, 异步暂存!

3.1 整体设计思路

外卖下订单后,可以慢慢等待运单中心数据生成,并非强制要求同时性

可靠生产:保证消息一定要发送到Rabitmq服务

可靠消费:保证消息取出来一定正确消费掉

最终使多方数据达到一致。

3.2 步骤1 - 可靠的消息生产记录消息发送

存在隐患 - 可能消息发送失败呀!

为了确保数据一定成功发送到MQ。

在同一事务中,增加一个记录表的操作, 记录每一条发往MQ的数据以及它的发送状态

于是我们在订单系统中增加一个本地信息表

于是在代码实践中,不再通过HTTP接口调用运单系统接口,而是使用MQ

生成订单时,也保存本地信息表

3.3 步骤2 - 可靠消息生产(修改消息发送状态)

利用RabbitMQ事务发布确认机制(confirm)

开启后,MQ准确受理消息会返回回执

然后就能知道如何更新本地信息表了

-确保在SB中开启Confirm机制

如果出现回执没收到、消息状态修改失败等特殊情况

兜底方案:定时检查消息表,超时没发送成功,再次重发

3.4 步骤3 - 可靠消息处理(正常处理)

运单系统收到消息数据后,突然宕机,或者访问运单DB时,DB突然宕机,消息数据不就丢了吗!!!

于是需要以下特性:

幂等性

防止重复消息数据的处理,一次用户操作,只对应一次数据处理

开启手动ACK模式

由消费者控制消息的重发/清除/丢弃

3.5 步骤4 - 可靠消息处理(消息重发)

消费者处理失败,需要MQ再次重发给消费者。

出现异常一般会重试几次,由消费者自身记录重试次数,并进行次数控制(不会永远重试!)

3.6 步骤五 - 可靠消息处理(消息丢弃)

消费者处理失败,直接丢弃或者转移到死信队列(DLQ)

重试次数过多、消息内容格式错误等情况,通过线上预警机制通知运维人员

4 总结及扩展

4.1 MQ方案的优点和缺点

口优点

通用性强

拓展性强

方案成熟

口缺点

基于消息中间件,只适合异步场景

消息处理会有延迟,需要业务上能够容忍

尽量避免分布式事务;

尽量将非核心事务做成异步;

4.2 拓展

分布式事务解决方案的理论依据

CAP理论

BASE理论

2PC协议

3PC协议

Paxos算法.

Raft一致性协议

 

   
次浏览       
相关文章

企业架构、TOGAF与ArchiMate概览
架构师之路-如何做好业务建模?
大型网站电商网站架构案例和技术架构的示例
完整的Archimate视点指南(包括示例)
相关文档

数据中台技术架构方法论与实践
适用ArchiMate、EA 和 iSpace进行企业架构建模
Zachman企业架构框架简介
企业架构让SOA落地
相关课程

云平台与微服务架构设计
中台战略、中台建设与数字商业
亿级用户高并发、高可用系统架构
高可用分布式架构设计与实践
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]
 
最新文章
架构设计-谈谈架构
实现SaaS(软件及服务)架构三大技术挑战
到底什么是数据中台?
响应式架构简介
业务架构、应用架构与云基础架构
最新课程
软件架构设计方法、案例与实践
从大型电商架构演进看互联网高可用架构设计
大型互联网高可用架构设计实践
企业架构师 (TOGAF官方认证)
嵌入式软件架构设计—高级实践
更多...   
成功案例
某新能源电力企业 软件架构设计方法、案例与实践
中航工业某研究所 嵌入式软件开发指南
某轨道交通行业 嵌入式软件高级设计实践
北京 航天科工某子公司 软件测试架构师
北京某领先数字地图 架构师(设计案例)
更多...