当前位置:网站首页>分布式事务—基于消息补偿的最终一致性方案(本地消息表、消息队列)
分布式事务—基于消息补偿的最终一致性方案(本地消息表、消息队列)
2022-06-28 01:10:00 【May Hacker】
前言
基于消息补偿的最终一致性方案是一种分布式事务的实现方式,又包括本地消息表、消息队列两种方式。
一、本地消息表
核心思想是将分布式事务拆分成本地事务进行处理,本地消息表实现最终一致性。

- 步骤1和2,系统收到用户下单请求,将订单业务数据写入订单表中,同时把该订单对应的消息数据写入本地消息表中,订单表与本地消息表为同一个数据库,更新订单和存储消息为同一个本地事务,数据库事务处理,要么都成功,要么都失败。
- 步骤345,订单服务发送消息到消息队列,库存服务收到消息,进行库存业务操作,更新库存数据
- 步骤6和7,返回业务处理结果,订单服务收到结果后,将本地消息表中的数据设置完成状态或者删除数据。
- 步骤8,另起定时任务,定时扫描本地消息表,看是否有未完成的任务,有则重试。
优缺点
- 实现简单,开发成本低
- 订单表与本地消息表为同一个数据库
二、支持事务的消息队列
RMQ支持事务消息,与常见的数据库事务流程类似,生产者生产一条事务消息,等生产者本地操作ok了,会向MQ Server发送提交确认。
在这种情况下,事务消息初始被扔到消息队列中是没办法消费的,只有当该事务消息被提交了,这个消息才能被消费者所消费。
同理,如果rollback了,RMQ会从消息队列中把该消息删掉。

- 生产者生产消息给MQ,此时未提交,称该消息为HalfMsg,即半消息
- MQ受到该消息,会给生产者一个OK确认
- 生产者执行本地事务
- 根据本地事务执行的结果向MQ提交commit或者rollback,MQ根据commit或者rollback对消息进行相应操作,即消费或者丢弃
- 如果生产者提交commit或者rollback提交超时,即第四步没有收到来自生产者的请求,MQ回调检查该消息
- MQ回调检查本地事务的状态
参考
https://www.jianshu.com/p/e31d9ebed201
边栏推荐
- Win11如何关闭最近打开项目?Win11关闭最近打开项目的方法
- Exploration on the construction path of real-time digital warehouse integrating digital intelligence learning and streaming batch
- 【历史上的今天】6 月 23 日:图灵诞生日;互联网奠基人出生;Reddit 上线
- 面试:Bitmap像素内存分配在堆内存还是在native中
- JDBC与MySQL数据库
- Moving Tencent to the cloud: half of the evolution history of cloud server CVM
- Flask Foundation: template inheritance + static file configuration
- [today in history] June 1: Napster was founded; MS-DOS original author was born; Google sells Google SketchUp
- 【历史上的今天】6 月 8 日:万维网之父诞生;PHP 公开发布;iPhone 4 问世
- 【历史上的今天】6 月 6 日:世界 IPv6 启动纪念日;《俄罗斯方块》发布;小红书成立
猜你喜欢
![Packet capturing and sorting out external Fiddler -- understanding the toolbar [1]](/img/5f/24fd110a73734ba1638f0aad63c787.png)
Packet capturing and sorting out external Fiddler -- understanding the toolbar [1]
![[today in history] May 29: the pioneer of sharing software was born; Chromebox launched; VoodooPC founder was born](/img/ba/aa5db22e1391886a4e263d10e5f9f7.png)
[today in history] May 29: the pioneer of sharing software was born; Chromebox launched; VoodooPC founder was born

【插件-statistic】统计代码行数和相关数据

math_ (function & sequence) meaning of limit & misunderstanding and symbol sorting / neighborhood & de centring neighborhood & neighborhood radius

基于STM32的编写

What if win11 can't drag an image to the taskbar software to open it quickly

Get 5 offers after being notified of layoffs

【模糊神经网络】基于matlab的模糊神经网络仿真

毕业季来临,2022届高校毕业生人数首次突破千万大关

Win11不能拖拽图片到任务栏软件上快速打开怎么办
随机推荐
【倒立摆控制】基于UKF无迹卡尔曼滤波的倒立摆控制simulink仿真
Opencv -- Hough transform and some problems encountered
Arduino Esp8266 Web LED控制
在线JSON转PlainText工具
第三批入围企业公示!年度TOP100智能网联供应商评选
如何判断线程池已经执行完所有任务了?
Mixed programming of C language and assembly language in stm32
字节跳动面试官:一张图片占据的内存大小是如何计算
数仓的字符截取三胞胎:substrb、substr、substring
【历史上的今天】6 月 15 日:第一个手机病毒;AI 巨匠司马贺诞生;Chromebook 发布
CMU提出NLP新范式—重构预训练,高考英语交出134高分
如何开启多语言文本建议?Win11打开多语言文本建议的方法
Flashtext, a data cleaning tool, has directly increased the efficiency by dozens of times
isEmpty 和 isBlank 的用法區別
英特尔锐炫A380显卡即将在中国面市
【二维码图像矫正增强】基于MATLAB的二维码图像矫正增强处理仿真
Is it safe for qiniu to open an account? How do I open an account online?
数据清洗工具flashtext,效率直接提升了几十倍数
JDBC and MySQL databases
[today in history] June 3: Microsoft launched Bing search engine; Larry Roberts starts ARPANET; The father of Visual Basic was born