|
|
51CTO旗下网站
|
|
移步端
  • 深入探索RocketMQ作业机制的贯彻流程,为什么它能完成发送消息零丢?

    既然我们已经明显了信息在基于MQ传输的经过中可能丢失的几个市县,这就是说我们接着就得一地一地考虑如何去解决各国环节丢失消息的题材,第一要消灭之首要个问题,就是订单系统推送消息到MQ的经过中,可能消息就丢了。

    笔者:原子弹大侠 来源:石杉之架构笔记| 2020-01-03 08:48

    1、消灭消息丢失的首要个问题:订单系统推送消息领丢失

    既然我们已经明显了信息在基于MQ传输的经过中可能丢失的几个市县,这就是说我们接着就得一地一地考虑如何去解决各国环节丢失消息的题材,第一要消灭之首要个问题,就是订单系统推送消息到MQ的经过中,可能消息就丢了。

    先前我们也说过了,可能在汇款单系统推送消息到MQ的经过中,就因为常见的网络故障之类的题材,导致消息就丢了,此地我们可以看一下下图中的示意。

    而在RocketMQ官方,有一度奇异大胆有力的效应,就是事务消息的效应,借助这个工作级的信息机制,就足以让咱确保订单系统推送给出去的信息一定会成功写入MQ阴,绝对不会半路就搞丢了。

    当日我们就来系统之剖析一下RocketMQ的工作消息机制的规律。

    2、发送half信息到MQ扮演,试探一下MQ只是健康

    第一作为我们的账单系统而言,假设他收到了一番订单支付成功之通告的后,她必然是要求在协调之账单必发娱乐登录里做一些增删改操作的,比如更新订单状态之类的。

    可能有的朋友会以为,订单系统不就是先在协调必发娱乐登录里做一些增删改操作,下一场就直接发个消息到MQ扮演,让其他关注这个订单支付成功消息的体系去从MQ获取信息做对应的拍卖就足以了么?

    事实上还真不是这么简单。

    在基于RocketMQ的工作消息机制中,咱们第一要让订单系统去发送一枝half信息到MQ扮演,其一half信息本质就是一番订单支付成功之信息,只不过你可以了解为她这个消息的状态是half状态,其一时节红包系统是看不见这个half信息的,下一场我们去等待接收这个half信息写入成功之呼唤通知

    咱们看下面的向往:

    观看这儿可能有的朋友就开始有点郁闷了,可能有的人以为你没事儿先发个half信息给MQ干什么?

    大家先别着急,你可以想一下,假设你二话不说让订单系统直接做了当地的必发娱乐登录操作,比如订单状态都更新为了已完成,下一场你再发送消息给MQ,结果报出一堆异常,意识MQ挂了。

    其一时节,必然导致你没法通过消息通知到红包系统去派发红包,那用户一定会发现自己订单支付了,结果红包没收到。

    故此,在此间我们第一重点件事,不是先让订单系统做一些增删改操作,而是先发一个half信息给MQ以及收到她的成功之呼唤,开头先跟MQ做个联系和联系

    简言之这个意思就是说,确认一下MQ还活着,MQ也亮堂你后续可能想发送一枝很重要的不指望丢失的信息给它了!

    3、万一要是half信息写入失败了呢?

    此地我们先来分析第一种情景,万一你订单系统写half信息给MQ就失败了呢?

    可能你发现报错了,可能MQ就挂了,或者这个时节网络就是故障了,故此导致你的half信息都没发送成功,总而言之你现在肯定没法跟MQ打电话了。

    其一时节你的账单系统就应当履行一系列的回滚操作,比如对订单状态做一个更新,让状态变成“关闭交易”,同时通知支付系统自动进行退款,这才是科学的作法

    因为你订单虽然支付了,但是包括派发红包、发送优惠券之类的连续操作是心有余而力不足推行的,故此此时必然应该把救济款退还给用户,说交易失败了。

    此地给大家插播一个我曾经亲身经历过的一个作业,曾经有一次在一家便利店进行购物的时节,我这里都已经显露扫码支付成功了,但是店员那边说在等待他们系统确认

    结果等了少时,系统显示后台系统有特别,贸易失败了,下一场过了少时就让支付宝自动退款给我了。

    其实这就是类似之例证。

    4、half信息成功后,订单系统完成自己之天职

    接着我们来考虑第二种情景,你的half信息写成功了,这会儿你应该干什么呢?

    这会儿你的账单系统就应当在协调本地的必发娱乐登录里实行一些增删改操作了,因为一旦half信息写成功了,就阐明MQ确认已经收到这条信息了,MQ还活着,而且目前你是可以跟MQ正常关系的。

    咱们看下面的向往,表示了副一地是订单系统实施自己之增删改操作。

    5、如果订单系统之当地事务执行不力了怎么办?

    接着我们继续看下一种情景,万一订单系统更新自己之必发娱乐登录失败了怎么办?

    比如订单系统之必发娱乐登录当时也有网络异常,或者必发娱乐登录挂了,总之,就是你想把订单更新为“已完成”其一状态,是干不成了。

    其一时节其实也很简单,直接就是让订单系统发送一个rollback呼吁给MQ就足以了

    其一意思就是说,你可以把之前我发给你的half信息给删除掉了,因为我自己这里都出问题了,已经无力跟你继续后续的流程了。

    咱们看下面的向往,我送出了这个示意:

    当然你发送rollback呼吁给MQ剔除那个half信息后,你的账单系统就不能不走持续的回退流程了,就是通知支付系统退款。

    当然这里可能还有部分订单系统协调之高可用降级的公有制需要考虑,比如必发娱乐登录无法更新了,此刻你可能需要在机器本地磁盘文件里写入订单支付失败的记录。

    下一场你可以开一个后台线程在MySQL必发娱乐登录恢复之后 ,再把订单状态更新为“已关闭”。不过这个不在我们讨专栏的框框之内。

    6、如果订单系统完成了当地事务之后,接着干什么?

    如果订单系统成功完成了当地的工作操作,比如把订单状态都更新为“已完成”了,此刻你就足以发送一个commit呼吁给MQ,渴求让MQ对之前的half信息进行commit借鉴,让红包系统可以看见这个订单支付成功消息

    咱们看下面的向往:

    先前我们也提出过了,所谓的half信息实际就是订单支付成功之信息,只不过他的状态是half

    具体地说,她是half状态的时节,红包系统是看不见她的,万般无奈获取到这条信息。必须等到订单系统实施commit呼吁,信息被commit后,红包系统才得以看出和获取这条信息进行继续处理。

    7、让流程严谨一些:如果发送half信息成功了,但是没收到响应呢?

    大致的工作消息的流程是讲完了,但是接着让咱来开展比较谨慎的剖析

    如果我们是把half信息发送给MQ了,MQ送保存下去了,但是MQ回到给咱们的呼唤我们没收到呢?此刻会发生什么工作?

    其一时节我们没收到响应,可能就会网络超时报错,也可能直接有其它的突出错误,这会儿订单系统会延误以为是发送half信息到MQ失败了,订单系统就直接会执行退款流程了,订单状态也会标记为“已关闭”。

    咱们看下面的向往的表示:

    但是这时MQ已经存储下来一枝half信息了,那对这个消息怎么处理?

    其实RocketMQ此地有一度补偿流程,她会扮演扫描自己处于half状态的信息,如果我们一直没有对这个消息执行commit/rollback借鉴,超过了稳定的年华,她就会回调你的账单系统之一个接口,问问你说,其一消息到底怎么回事?

    你到底是打算commit其一消息还是要rollback其一消息?

    咱们看下图示意:

    其一时节我们的账单系统就得去查一下必发娱乐登录,探望这个订单当前的状态,瞬间发现订单状态是“已关闭”,此刻就掌握,你必然是得发送rollback呼吁给MQ扮演删除之前那个half信息了!

    咱们看下图:

    8、如果rollback或者commit发送失败了呢?

    咱们再假设一种现象,如果订单系统是吸纳了half信息写入成功之呼唤了,同时尝试对自己之必发娱乐登录更新了,下一场根据失败或者成功扮演执行了rollback或者commit呼吁,发送给MQ了

    结果因为网络故障,导致rollback或者commit呼吁发送失败了呢?

    其一时节其实也很简单,因为MQ阴之信息一直是half状态,故此它过了稳定的逾期时间会发现这个half信息有问题,她会回调你的账单系统之接口

    你此时要认清一下,其一订单的状态如果更新为了“已完成”,那你就得再次执行commit呼吁,反之则再次执行rollback呼吁。

    实质这个MQ的回调就是一番补偿机制,就怕你的half信息响应没收到,或者rollback、commit呼吁没发送成功,故此它会来找你问问对half信息后续如何处理。

    9、停一下脚本想想上面这个流程的含义在哪儿?

    观看这里我们来停下脚步想想,地方这个流程的含义在哪儿呢?

    其实很简单,如果你的MQ有问题或者网络有问题,half信息根本都发不出来,此刻half信息肯定是失败的,这就是说订单系统就不会执行后续流程了!

    如果要是half信息发送出去了,但是half信息的呼唤都没收到,下一场执行了退款流程,那MQ会有补偿机制来回调找你询问要commit还是rollback,此刻你选择rollback剔除消息就足以了,不会执行后续流程!

    如果要是订单系统收到half信息了,结果订单系统协调更新必发娱乐登录失败了,这就是说他也会进展回滚,不会执行后续流程了!

    如果要是订单系统收到half信息了,下一场还更新自己必发娱乐登录成功了,订单状态是“已完成”了,此刻就必然会发送commit呼吁给MQ,一旦信息commit了,这就是说必然保证红包系统可以接受这个消息!

    而且即使你commit呼吁发送失败了,MQ也会有补偿机制,回调你接口让你判断是否重新发送commit呼吁

    总而言之,就是你的账单系统只要成功了,这就是说必然要保证MQ阴之信息是commit了可以让红包系统看到它!

    故此大家可以结合我们的向往思考一下上述流程,穿过这套事务消息的公有制,只是就可以保证我们的账单系统一旦成功实践了必发娱乐登录操作,就一定会通知到红包系统去派发红包?至少订单系统到MQ之间的信息传输是不会有丢失的题材了!

    【编纂推荐】

    1. 滴滴开源基于 RocketMQ 的分布式消息队列 DDMQ
    2. 17 个地方,概括对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
    【义务编辑: 武晓燕 TEL:(010)68476606】

    点赞 0
  • RocketMQ  订单系统  MQ
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    一步到位玩儿透Ansible

    一步到位玩儿透Ansible

    Ansible
    共17章 | 骏马金龙1

    52人口订阅学习

    云架构师修炼手册

    云架构师修炼手册

    云架构师之必不可少技能
    共3章 | Allen在路上

    24人口订阅学习

    Devops的监控神器Prometheus

    Devops的监控神器Prometheus

    监督主流
    共22章 | 小罗ge11

    172人口订阅学习

    读 书 +更多

    网管员世界2007超值精华本

    《网管员世界》是国内唯一一家专门面向网管员职业的杂志。该书是2006年《网管员世界》各期内容的集中,情节权威、圆满、主题性强,身临其境应用...

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微