https://my.oschina.net/u/1589819/blog/1503241

因为一直学习与尝试负责公司的推送相关业务,包括整个应用的实现,其中就采用了基于消息队列的异步事件驱动模型来做解耦异步处理,所以就要去做了解一些相关的知识点,这边稍作总结,并整理一下消息补偿机制的一套简单实现的代码设计图。

采用基于消息队列的异步事件驱动模型来解决问题的时候,一个计较棘手的问题就是事务的一致性。

案例:现在用户发起一个创建订单的请求,如果我们是单系统架构,那么修改订单表,修改库存表可能都是在同一个事务中完成,所以轻而易举就达到了事物一致性原则,但是这不是我们要讨论的,所以就带过。现在微服务架构在互联网公司大火特火,热度未减,分布式是事务也成为了一个亟待解决的问题,阿里云GTS标榜如何让分布式事务更简单。

比如,用户发起一个创建订单的请求,首先在订单服务上生成了新的订单,同时还要去库存服务中减去库存,因为是分布式架构,所以库存扣减与订单创建可能是在两个遥远的机器上,如果想要通过本地事务来解决那几乎是不可能的,保证两个事务之间的状态一致性——订单创建成功,库存扣减失败,如何回滚订单?一直都是分布式架构中绕不开的挑战。

分布式架构中如何解决事务问题,在很多技术群都上都在讨论,比如dubbo , spring cloud等等。目前还没有接触到这方面相关知识,后续如果有幸参与,可做分享,本次想要聊的是假基于消息队列的异步事件驱动是如何解决如上的分布式问题,以及如何保证事务一致性。

事务一致性原则(ACID):

  • Atomicity - 原子性,改变数据状态要么是一起完成,要么一起失败

  • Consistency - 一致性,数据的状态是完整一致的

  • Isolation - 隔离线,即使有并发事务,互相之间也不影响

  • Durability - 持久性, 一旦事务提交,不可撤销

订单创建完成之后,发送一个createOrderEvent到消息队列中,由消息队列负责转发给订阅该消息的消费者进行处理。

好,这个时候如果消息消费 成功,但是库存不足,库存扣减失败,订单创建则不能成功,这个时候很好处理,由库存服务推送一个subInventoryFail给到订单服务,订单服务根据消息将订单转为失败状态。

1、从用户体验的角度来说,整个过程是异步的,所以对于用户的体验来说,就做不到“立马成功或立马失败”的效果。

2、从技术的角度来说,整个过程你不再关注同一个事物的问题,而是关注最终订单的状态是否一致。【注:从分布式事务<-->最终一致性】保证事务最终一致性,但是基于这种事件驱动达到最终一致,解耦事务的成功实施需要依赖几个因素。

a、消息的投递是否可靠。

b、消息的可靠性,例如订单服务已经成功创建订单,但是还没来得及发送消息就宕机或者各种原因,导致订单的状态不一致。

基于以上两点的考虑,我们使用了一种基于本地事务的方案来保证消息最终的一致性。

创建订单与创建消息事件都在本地事务中,属于同一个事务,可以保证订单表与消息事件表的数据一致性。发送消息到消息中间件,在事务提交之后发送。到了库存服务的时候,启动一个定时任务去扫描消息事件表,将未投递失败/消费 失败的消息进行消费,即补偿事务一致性。

定时任务的方案可能不是最佳的,可以稍作改定,比如采用阿里巴巴开源的Canal。

公司目前也是采用这种架构来解决订单与库存问题。有网友的做法是保证消息投递的可靠性,我们则是保证消费的一致性,具体的文章点我>>

可以将消息队列的进行封装,做成了一个starter,代码设计上大致如图下:

简单聊聊消息队列的事务补偿机制相关推荐

  1. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  2. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规 ...

  3. 关于分布式事务 两阶段提交 一阶段提交 Best Efforts 1PC模式和事务补偿机制的研究

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规 ...

  4. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究...

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规 ...

  5. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]...

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  6. thinkphp 实现redis简单的消息队列

    thinkphp 实现redis简单的消息队列 本章简单的实现.消息队列的入列和出列 1.入列,入列作为生产者,只管尽情的成产即可,无需考虑其他 (秒杀.抢购场景除外). 此次我们假如有十个用户进入队 ...

  7. 消息队列之事务消息,RocketMQ 和 Kafka是如何做的?

    一说起事务相信大家都不陌生,脑海里蹦出来的就是 ACID. 通常我们理解的事务就是为了一些更新操作要么都成功,要么都失败,不会有中间状态的产生,而 ACID 是一个严格的事务实现的定义,不过在单体系统 ...

  8. 用了8年MQ,聊聊消息队列的技术选型,哪个最香?

    谈起消息队列,内心还是会有些波澜. 消息队列,缓存,分库分表是高并发解决方案三剑客,而消息队列是我最喜欢,也是思考最多的技术. 我想按照下面的四个阶段分享我与消息队列的故事,同时也是对我技术成长经历的 ...

  9. “简单”的消息队列与kafka

    小时候就特别喜欢龙系精灵,特别是乘龙,后来才知道只是冰水...尴尬. 在宠物小精灵中,乘龙一直是训练家的载人伙伴,和我们下面的MQ好像有几分相似呢~~ 前言 MQ,全称消息队列,现在市面上有很多种消息 ...

最新文章

  1. 自己做网站服务器需要买吗,自己做网站要买服务器
  2. 空值替换为0_「Excel」是零值还是空值,你可以自由掌控
  3. 判断客户端是电脑还是手机
  4. 双机调试和windbg的命令
  5. Oracle入门(五F)之11g show spparameter 命令的使用
  6. 对象拷贝的工具类DeepBeanUtils
  7. 做企业需要一点逆向思维
  8. 头条鼓励内容营销吗?创作商品营销内容会不会限制推荐?
  9. 区块链 solidity 零知识证明DApp开发实践【身份证明/以太坊】
  10. 如何在代码里打开Android手机通知状态栏
  11. 关于无线网络的静态ip与动态ip设置
  12. 360路由器v2刷第三方固件_不走弯路:小米路由器3G 刷Padavan固件简单教程
  13. 利用charles抓包
  14. 施一公 谈英文论文写作
  15. 实战:RBAC(基于角色的权限控制)-2021.11.28
  16. 斯年,愿做岁月的知音
  17. 按下键盘计算机具体发生了点儿啥?
  18. 概率论0—概率初步简介
  19. 本地git的分支名称变空的处理方法
  20. 记录wps js 宏学习过程中积累的一些函数模板

热门文章

  1. 【人工智能项目】深度学习实现汉字书法识别
  2. 哲学笔记:之:天道性命
  3. Mac磁盘工具教程 – 抹掉并重新格式化硬盘/移动硬盘
  4. Matlab浮点变定点
  5. 【基于NSR3588开发板Android12三屏拼接显示实例】
  6. NSR学习笔记(手写版)
  7. 十进制转化为二进制(栈算法)
  8. vsCode git 操作提示 Permission denied, please try again
  9. Invariance Matters: Exemplar Memory for Domain Adaptive Person Re-identification
  10. 绿色便携版杀毒软件Clamwin也能自动作业