快捷搜索:  as  创意文化园  2153  趵突泉  济南趵突泉  雷杰  test  扬尘

.Net Core with 微服务 - 漫衍式事务 - 可靠新闻最终一致性

皇冠最新登陆网址www.22223388.com)实时更新发布最新最快的皇冠最新登陆代理线路网址、皇冠最新登陆会员线路网址、皇冠最新备用登录网址、皇冠最新手机版登录网址。

前面我们讲了漫衍式事务的2PC、3PC , TCC 的原理。这些事务实在都在全力的模拟数据库的事务,我们可以简朴的以为他们是一个同步行的事务。稀奇是 2PC,3PC 他们完全行使数据库的事务能力,在一阶段最先事务后不进提交会严重影响应用程序的并发性能。TCC 一阶段虽然不会壅闭数据库,然则它同样是在全力追求同时乐成同时失败的一致性要求。然则在许多时刻,我们的应用程序的焦点营业为了追求更高的性能、更高的可用性,可以允许在一段时间内的数据纷歧致性,只需要在最终时刻数据是一致就可以了。基于以上场景我们可以接纳基于可靠新闻服务的最终一致性漫衍式事务处置方案。

总体架构


可靠新闻最终一致性的架构上分3个部门:

  1. 自动方:自动提议事务的一方,一样平常是指漫衍式事务中最先最先执行的谁人服务,也是焦点营业服务
  2. 可靠新闻服务:可靠新闻服务由关系型数据库、新闻行列MQ等组件组成,行使关系型数据库的强一致性特征来持久化新闻的状态,行使MQ来保证新闻的可靠投递及消费
  3. 被动方:被动方订阅MQ的新闻,当收到MQ的新闻后执行对应的营业
    以上是对照粗狂的结构图,下面我们来详细剖析一下这个事务的执行历程。

流程


该方案总体流程上可分为以下步骤:

  1. 自动方在真正的营业最先前先向可靠新闻服务发送一个“待确认”的新闻
  2. 可靠新闻服务收到待确认新闻后持久化新闻到数据库
  3. 若是以上操作乐成则自动方最先真正的营业,若是失败则直接放弃执行营业
  4. 若是营业执行乐成则发送“确认”新闻给可靠新闻服务,若是执行失败则发送“作废”给可靠新闻服务。
  5. 若是可靠新闻服务收到“确认”新闻则更新数据库里的新闻纪录的状态为“待发送”,若是收到的新闻为“作废”则更新新闻状态为“已作废”
  6. 若是上一步更新的数据库为“待发送”,那么会最先往MQ投递新闻,而且更改数据库里的新闻纪录的状态为“已发送”
  7. 上一步往MQ投递新闻乐成后,MQ会给被动方推送新闻。
  8. 被动方收到新闻后最先处置营业
  9. 若是营业处置乐成,则被动方对MQ举行ACK回复,则这条新闻会从MQ内移除掉
  10. 若是营业处置乐成,则发送“已完成”新闻给可靠新闻服务
  11. 可靠新闻服务收到“已完成”新闻后更新数据库新闻纪录未“已完成”

异常处置

以上我们形貌的是一套在理想情形下执行的逻辑。然则漫衍式系统由于网络的存在,网络的不能靠性会导致我们新闻的转达没设施100%乐成。我们的可靠新闻服务跟自动方、被动方之间的交互也是漫衍式的,这就需要我们在流程上有许多抵偿的机制。以下我们来讨论一些异常情形:

五湖四海足球吧www.22223388.com)凝集民间高手免费提供各联赛足球资讯、足球推荐、足球贴士等,致力为广大波友提供更全面、更专业的赛前预测分析,让更多球迷随时随地找到自己想要的赛事资讯,以及在本站尽情发言自己的观点。

  1. 若是步骤1发送“待确认”新闻失败,自动方营业不会执行,直接放弃事务,不会有影响
  2. 若是步骤1发送“待确认”新闻乐成,而且可靠新闻已经更新“待确认”乐成,然则由于网络问题,好比超时,自动方获得的效果是失败,自动方会放弃执行事务,符号为“已作废”。这个时刻就会泛起可靠新闻服务跟自动方的状态泛起纷歧致的情形。
    为解决这个问题,我需要自动方提供一个事务状态查询接口,可靠新闻服务这边则启动一个准时义务,准时去查这些长时间处于待确认的事务,然后通过自动方的接口确认这些事务是已执行,照样已作废。
  3. 若是步骤4,自动方发送“确认”新闻失败,可靠新闻服务会通过准时义务通过自动方的查询接口去确认状态。
  4. 步骤6,投递新闻给MQ跟更新状态为“已发送”,是这个流程中至关主要的一步。理想的流程是整个2个操作同时乐成同时失败,保持强一致性。网上许多文章都市说“为了保证发送MQ新闻跟更新新闻状态同时乐成同时失败,需要把这个2个步骤写统一个内陆事务中”。这是完全不靠谱的,数据库跟MQ本就是2个自力的服务,若是通过一个内陆的事务就能保证一致性,那么我们现在讨论的漫衍式事务毫无意义,直接写在一个内陆事务里不就完了么。
    写在内陆事务内只能尽可能的保证数据库更新跟MQ投递新闻同时乐成,然则并不能保证100%一致。
    以下我们来分2种情形剖析失败的情形:
事务最先
1. send to mq
2. database update
事务竣事

先发送 MQ 新闻,可能 MQ 新闻发送乐成,然则database由于某些缘故原由更新失败了。数据库可以回滚,然则通常的MQ没有回滚能力。

事务最先
1. database update
2. send to mq
事务竣事

先更新数据库,再发送 MQ 新闻,同样会有问题。就算1,2都执行乐成了,然则事务是需要提交的,数据库有可能在提交阶段失败,数据库是可以回滚,然则 MQ 的新闻已经发出去了,它并没有回滚的能力。
为领会决这个问题,我们同样需要抵偿机制。在可靠新闻服务一侧开启准时义务,准时去查询那些耐久处于“待发送已发送”的事务,再次对 MQ 举行投递新闻。这个机制有可能造成被动方重复收到 MQ 的新闻,这就需要被动方处置营业的时刻要举行幂等处置。

总结

通过以上我们详细先容了可靠新闻最终一致性事务解决方案的总体结构跟执行的流程,以及对异常情形的一些抵偿方式,总体流程上照样对照清晰简朴的。然则可靠新闻最终一致性方案在使用上也是具有对照强的局限性,由于它的异步特征跟有可能泛起的高延时性不适合处置一些敏感营业。好比它适合处置消费新增积分场景,然则不合适处置积分兑换礼物的场景。由于若是积分扣减延迟了,那么用户就可能兑换超出自己积分多的多的礼物。以是我们选择漫衍式事务的时刻还需凭证场景来举行选择。
好了讲了这么多漫衍式事务的原理,下一期我们使用 .NET 真正的实现一个漫衍式事务,敬请期待。

.Net Core with 微服务 - 什么是微服务
.Net Core with 微服务 - 架构图
.Net Core with 微服务 - Ocelot 网关
.Net Core with 微服务 - Consul 注册中央
.Net Core with 微服务 - Seq 日志聚合
.Net Core with 微服务 - Elastic APM
.Net Core with 微服务 - Consul 设置中央
.Net Core with 微服务 - Polly 熔断降级
.Net Core with 微服务 - 漫衍式事务 - 2PC、3PC
.Net Core with 微服务 - 漫衍式事务 - TCC

关注我的民众号一起玩转手艺

环球ug代理开户www.ugbet.us)开放环球UG代理登录网址、会员登录网址、环球UG会员注册、环球UG代理开户申请、环球UG电脑客户端、环球UG手机版下载等业务。

发表评论
sunbet声明:该文看法仅代表作者自己,与本平台无关。请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片

您可能还会对下面的文章感兴趣: