SpringCloud集成RocketMQ实现可靠消息最终一致性【本地消息表、RocketMQ 事务消息方案】

论坛 期权论坛     
选择匿名的用户   2021-5-22 15:15   20   0
<p id="main-toc"><strong>目录</strong></p>
<p id="%E4%B8%80%E3%80%81%E5%8F%AF%E9%9D%A0%E6%B6%88%E6%81%AF%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7%E4%BA%8B%E5%8A%A1%E6%A6%82%E8%BF%B0-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/a1036645146/article/details/109362669#%E4%B8%80%E3%80%81%E5%8F%AF%E9%9D%A0%E6%B6%88%E6%81%AF%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7%E4%BA%8B%E5%8A%A1%E6%A6%82%E8%BF%B0">一、可靠消息最终一致性事务概述</a></p>
<p id="%E4%BA%8C%E3%80%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/a1036645146/article/details/109362669#%E4%BA%8C%E3%80%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">二、解决方案【本地消息表方案 】</a></p>
<p id="%E4%B8%89%E3%80%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E3%80%90RocketMQ%E4%BA%8B%E5%8A%A1%E6%B6%88%E6%81%AF%E6%96%B9%E6%A1%88%20%E3%80%91-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/a1036645146/article/details/109362669#%E4%B8%89%E3%80%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E3%80%90RocketMQ%E4%BA%8B%E5%8A%A1%E6%B6%88%E6%81%AF%E6%96%B9%E6%A1%88%20%E3%80%91">三、解决方案【RocketMQ事务消息方案 】</a></p>
<p id="%E5%9B%9B%E3%80%81RocketMQ%E5%AE%9E%E7%8E%B0%E5%8F%AF%E9%9D%A0%E6%B6%88%E6%81%AF%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7%E4%BA%8B%E5%8A%A1-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/a1036645146/article/details/109362669#%E5%9B%9B%E3%80%81RocketMQ%E5%AE%9E%E7%8E%B0%E5%8F%AF%E9%9D%A0%E6%B6%88%E6%81%AF%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7%E4%BA%8B%E5%8A%A1">四、RocketMQ实现可靠消息最终一致性事务</a></p>
<p id="%E4%BA%94%E3%80%81%E6%80%BB%E7%BB%93-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/a1036645146/article/details/109362669#%E4%BA%94%E3%80%81%E6%80%BB%E7%BB%93">五、总结</a></p>
<hr id="hr-toc">
<h3 id="%E4%B8%80%E3%80%81%E5%8F%AF%E9%9D%A0%E6%B6%88%E6%81%AF%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E6%80%A7%E4%BA%8B%E5%8A%A1%E6%A6%82%E8%BF%B0">一、可靠消息最终一致性事务概述</h3>
<hr>
<p>可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方<strong>最终事务要达到一致</strong>。 此方案是利用消息中间件完成,如下图:<br><img alt="" height="79" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-28dea677ad38d3185314743ed6d2956b.png" width="704"></p>
<p>事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件之间,事务参与方(消息消费方)和消息中间件之间都是通过<strong>网络通信</strong>,由于网络通信的不确定性会导致分布式事务问题。因此可靠消息最终一致性方案要解决以下几个问题:<br> 【1】<strong><span style="color:#f33b45;">本地事务</span>与<span style="color:#f33b45;">消息发送</span>的原子性问题:</strong>事务发起方在本地事务执行成功后消息必须发出去,否则就丢弃消息。即<strong>实现本地事务和消息发送的原子性</strong>,要么都成功,要么都失败。<span style="color:#ffbb66;">本地事务与消息发送的原子性问题是实现可靠消息最终一致性方案的</span><strong>关键问题</strong>。先来尝试下这种操作,<span style="color:#3399ea;"><strong>先发送消息,再操作数据库</strong></span><strong>:</strong>这种情况下无法保证数据库操作与发送消息的一致性,因为可能发送消息成功,数据库操作失败。</p>
<pre class="blockcode"><code class="language-java">begin transaction;

//1.发送MQ

//2.数据库操作

commit transation;</code></pre>
<p>第二种方案,<span style="color:#3399ea;"><strong>先进行数据库操作,再发送消息</strong></span><strong>:</strong>这种情况下貌似没有问题,如果发送 MQ消息失败,就会抛出异常,导致数据库事务回滚。但是:</p>
<ul><li>如果是<span style="color:#f33b45;"><strong>超时异常</strong></span>,数据库回滚,但 MQ其实已经正常发送了,同样会导致不一致。</li><li>如果消息发送成功,在最后提交事务的时候JVM突然挂掉,事务没有成功提交,导致两个系统之间数据不一致。</li></ul>
<pre class="blockcode"><code class="language-java">begin transaction;

//1.数据库操作

//2.发送MQ

commit transation;</code></pre>
<p>【2】<strong>事务参与方接收消息的可靠性:</strong>事务参与方必须能够从消息队列接收到消息,如果接收消息失败可以<strong>重复接收消息</strong>。<br> 【3】<strong>消息重复消费的问题:</strong>由于步骤2的存在,若某一个消费节点<strong>超时</strong>但是消费成功,此时消息中间件会重复投递此消息,就导致了消息的重复消费。要解决消息重复消费的问题就要实现事务参与方的方
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP