springcloud

基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战

2019.11.11 02:29 3921浏览
					</div> 
				</div>	
			</div>
		</div> 

		 <!-- 手记详情 -->
		<div class="detail-content-wrap">  
			<div class="detail-content js-lookimg">
				
				<div><div class="cl-preview-section"><h1>1 极速了解MQ</h1>

介绍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 多系统间的分布式事务问题

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

错误的案例

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

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

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

  1. 接口调用成功,订单系统数据库事务提交失败,运单系统没有回滚,产生数据
  2. 接口调用超时,订单系统数据库事务回滚,运单系统接口继续执行,产生数据

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

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

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

  • 之前都是订单系统发送HTTP请求运单系统的接口,出问题了!
  • 因此我们考虑发消息给MQ, 异步暂存!

3.1 整体设计思路


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

  1. 可靠生产:保证消息一定要发送到Rabitmq服务
  2. 可靠消费:保证消息取出来一定正确消费掉

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

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方案的优点和缺点

口优点

  1. 通用性强
  2. 拓展性强
  3. 方案成熟

口缺点
4. 基于消息中间件,只适合异步场景
5. 消息处理会有延迟,需要业务上能够容忍

尽量避免分布式事务;
尽量将非核心事务做成异步;

4.2 拓展

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

CAP理论
BASE理论
2PC协议
3PC协议
Paxos算法.
Raft一致性协议

参考

点击查看更多内容

本文首次发布于慕课网 ,转载请注明出处,谢谢合作

	</div>	

	<div id="articleReply" style="display: block;"><div><img src="//img.mukewang.com/5dcba70c09df050213120400.jpg"></div><div></div></div>

	<div class="opus-wrap clearfix">
		<div class="detail-left">
			<div class="df-title" id="all_comments"><span class="comment-num"><i>0</i></span> 评论</div>
			<div class="detail-feedback-wrap">
				<!-- 评论框 -->
				<div class="df-ipt-wrap clearfix" id="comment">
				
					<div class="feeds-author l">
						
						评论
						
					</div>
					<p class="fadeInput l js-showcommentModal">共同学习,写下你的评论</p>
				
				</div>
				<!-- 评论框end -->
				<!-- 评论 -->
				<div id="js-feedback-list-wrap" class="feedback-list js-feedback-lookimg"><p class="feedback-none">暂无评论</p></div>
				<!-- 分页页码  -->
				<!-- <div class="qa-comment-page hide"></div> -->

				<div class="qa-comment-page hide" style="display: none;">
					<div class="moreBtn js-more" data-page="2">展开查看更多评论</div>
				</div>
			</div>
		</div>
	</div>
	<div class="article_wrap">
		<div class="line_con">
			<p class="line"></p>
			<p class="line_text">相关文章推荐</p>
		</div>
		<div class="article-wrapper">
			<div class="articleCon js-articleCon js-usercard-box">
				
			<div class="article clearfix">                    <div class="imgCon l">                        <img src="//img1.mukewang.com/5ba0f5030001eea004500253-200-200.jpg">                    </div>                    <div class="list-content l">                        <a href="/article/79868" target="_blank" class="title"><p>分布式系统消息中间件——RabbitMQ的使用基础篇</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>5</span>                                </div>                                <div data-fuid="6798319" class="nickName l js-usercard-dialog" data-userid="6798319">慕桂英3389331</div>                                <span class="skill clearfix"><a href="/article/tag/58" target="_blank"><span>深度学习</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">09.18</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//img1.mukewang.com/5bf3a0870001f33c02720272-200-200.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/270366" target="_blank" class="title"><p>利用消息队列处理分布式事务</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>1</span>                                </div>                                <div data-fuid="6463771" class="nickName l js-usercard-dialog" data-userid="6463771">holdtom</div>                                <span class="skill clearfix"><a href="/article/tag/3" target="_blank"><span>JAVA</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">12.29</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic29.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/278098" target="_blank" class="title"><p>基于Docker搭建分布式消息队列Kafka</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>4</span>                                </div>                                <div data-fuid="6798224" class="nickName l js-usercard-dialog" data-userid="6798224">三国纷争</div>                                <span class="skill clearfix"><a href="/article/tag/73" target="_blank"><span>Docker</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">02.13</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic27.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/272756" target="_blank" class="title"><p>大型网站架构系列:分布式消息队列</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>6</span>                                </div>                                <div data-fuid="6798209" class="nickName l js-usercard-dialog" data-userid="6798209">慕哥9229398</div>                                <span class="skill clearfix"><a href="/article/tag/35" target="_blank"><span>大数据</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">01.09</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic6.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/274415" target="_blank" class="title"><p>MQ消息队列</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>4</span>                                </div>                                <div data-fuid="6798217" class="nickName l js-usercard-dialog" data-userid="6798217">青春有我</div>                                <span class="skill clearfix"><a href="/article/tag/76" target="_blank"><span>架构</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">01.18</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic9.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/253718" target="_blank" class="title"><p>简谈阿里云MQ消息队列云服务的计费模式</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>5</span>                                </div>                                <div data-fuid="6825612" class="nickName l js-usercard-dialog" data-userid="6825612">慕的地10843</div>                                <span class="skill clearfix"><a href="/article/tag/103" target="_blank"><span>阿里云</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">10.13</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//img4.mukewang.com/5b37949500012f7805800330-200-200.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/40192" target="_blank" class="title"><p>M系统的MQ消息中间件选型:Kafka还是RabbitMQ?</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>5</span>                                </div>                                <div data-fuid="6458359" class="nickName l js-usercard-dialog" data-userid="6458359">慕后森</div>                                <span class="skill clearfix"><a href="/article/tag/58" target="_blank"><span>深度学习</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">06.30</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic25.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/274764" target="_blank" class="title"><p>分布式消息队列Apache RocketMQ源码剖析-Producer</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>5</span>                                </div>                                <div data-fuid="6798204" class="nickName l js-usercard-dialog" data-userid="6798204">慕神8447489</div>                                <span class="skill clearfix"><a href="/article/tag/76" target="_blank"><span>架构</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">01.20</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic27.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/50636" target="_blank" class="title"><p>Python中线程的MQ消息队列实现以及消息队列的优点解析</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>4</span>                                </div>                                <div data-fuid="6463711" class="nickName l js-usercard-dialog" data-userid="6463711">RISEBY</div>                                <span class="skill clearfix"><a href="/article/tag/18" target="_blank"><span>Python</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">08.06</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic18.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/269387" target="_blank" class="title"><p>分布式开放消息系统(RocketMQ)的原理与实践</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>3</span>                                </div>                                <div data-fuid="6798230" class="nickName l js-usercard-dialog" data-userid="6798230">九州编程</div>                                <span class="skill clearfix"><a href="/article/tag/35" target="_blank"><span>大数据</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">12.24</div>                        </a></div><a>                    </a></div><a>                </a></div><ul class="clearfix"><li class="l"><a href="/article/tag/142" target="_blank">API</a></li><li class="l"><a href="/article/tag/145" target="_blank">操作系统</a></li><li class="l"><a href="/article/tag/124" target="_blank">Django</a></li><li class="l"><a href="/article/tag/147" target="_blank">设计模式</a></li><li class="l"><a href="/article/tag/171" target="_blank">Swoole</a></li><li class="l"><a href="/article/tag/127" target="_blank">MVVM</a></li><li class="l"><a href="/article/tag/18" target="_blank">Python</a></li><li class="l"><a href="/article/tag/3" target="_blank">JAVA</a></li><li class="l"><a href="/article/tag/169" target="_blank">编解码</a></li><li class="l"><a href="/article/tag/77" target="_blank">安全</a></li></ul><div class="article clearfix">                    <div class="imgCon l">                        <img src="//img1.mukewang.com/5addf00600012d8503800240-200-200.jpg">                    </div>                    <div class="list-content l">                        <a href="/article/27364" target="_blank" class="title"><p>MQ(消息队列)常见的应用场景解析</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>17</span>                                </div>                                <div data-fuid="6305299" class="nickName l js-usercard-dialog" data-userid="6305299">喵喵一只汪</div>                                <span class="skill clearfix"><a href="/article/tag/58" target="_blank"><span>深度学习</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">04.23</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic17.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/266266" target="_blank" class="title"><p>MQ(消息队列)常见的应用场景解析</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>4</span>                                </div>                                <div data-fuid="6825612" class="nickName l js-usercard-dialog" data-userid="6825612">慕的地10843</div>                                <span class="skill clearfix"><a href="/article/tag/35" target="_blank"><span>大数据</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">12.05</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic8.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/272617" target="_blank" class="title"><p>RabbitMQ的消息丢失解决方案</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>1</span>                                </div>                                <div data-fuid="6798220" class="nickName l js-usercard-dialog" data-userid="6798220">撒科打诨</div>                                <span class="skill clearfix"><a href="/article/tag/105" target="_blank"><span>Kubernetes</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">01.08</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic22.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/254961" target="_blank" class="title"><p>消息中间件—RocketMQ消息消费(二)(push模式实现)</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>4</span>                                </div>                                <div data-fuid="6798195" class="nickName l js-usercard-dialog" data-userid="6798195">幕布斯6054654</div>                                <span class="skill clearfix"><a href="/article/tag/11" target="_blank"><span>MySQL</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">10.18</div>                        </a></div><a>                    </a></div><a>                </a></div><div class="article clearfix"><a>                    <div class="imgCon l">                        <img src="//www.imooc.com/static/img/article/cover/pic1.jpg">                    </div>                    </a><div class="list-content l"><a>                        </a><a href="/article/257250" target="_blank" class="title"><p>RabbitMQ的消息丢失解决方案</p></a>                        <div class="list-bottom clearfix">                            <div class="labels-area l clearfix">                                <div class="browseNum l">                                    <i class="imv2-visibility"></i>                                    <span>5</span>                                </div>                                <div data-fuid="6798202" class="nickName l js-usercard-dialog" data-userid="6798202">慕码人8056858</div>                                <span class="skill clearfix"><a href="/article/tag/17" target="_blank"><span>JavaScript</span></a><a></a></span><a>                        </a></div><a>                            <div class="createTime r">10.27</div>                        </a></div><a>                    </a></div><a>                </a></div></div>
			

		</div>
	</div>
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值