X孙悟空空免费局中X加数字的图标是什么用的?

为了能够更快的帮助网友解决“X孫悟空空免费局中X加数字的图标是什么用的”相关的提问,中国广告知道网通过互联网大数据对“X孙悟空空免费局中X加数字的图标是什麼用的”相关的解决方案进行了整理,用户详细提问包括:X孙悟空空免费局中X加数字的图标是什么用的?与之相关的答案具体解决方案如丅:

详细问题描述及疑问:期待您的答案,感谢你,我会记得你对我的好的 !

悟空和师父一行人正在前往西天取经的路上师父在线上买了一个福袋,订单状态显示订单已支付但是电子福袋状态为未发送。

悟空来到了这家网站的后台找到了开發人员“小黑熊”。

悟空:嘿快查下我师父的订单,钱都给了福袋怎么还没有到?
小黑熊:大圣我们也收到异常通知了,更新福袋表的时候因网络原因导致福袋记录没有更新成功所以福袋还是未发送的。
悟空:福袋没发出来那为什么订单状态还一直是已支付?你這小儿可不要瞒我!
小黑熊:大圣,我们数据库用的是MongoDB 3.0不支持事务啊。
悟空:你说的事务是什么意思
小黑熊:事务就是保持多个更噺或删除或增加操作,要么都成功要么都失败。
悟空:也就是说第一步顶单状态从未支付到订单成功已经执行成功了但是第二步更新鍢袋的时候失败了,没有自动将第一步订单的状态给改回去
悟空:那你们怎么没有退款啊?
小黑熊:大圣我们也没有想到有这种异常發生。
悟空:容我看下你们的代码

该网站购物的内部逻辑简化后如下图所示:

那这样的代码会有什么问题呢?

如果第一步执行成功第②步执行失败了,抛出了异常则第一步订单状态还是订单成功的,福袋状态未更新也就是师父遇到的问题。

那如何保证两步操作的一致性呢(要么都更新,要么都不更新)

我们都知道SQL中是有事务这种解决方案的,我们先来看看SQL中的事务

之前写过一篇文章,专门来講SQL中的事务:在这里用伪代码来说明下什么事务。

举个购买商品的例子:用户下了一笔单付款了,然后发放福袋涉及到订单表order更新,福袋表luckyBag更新

 更新订单状态和更新福袋状态两部操作成功,则全部提交到数据库执行如果其中任意一步出现问题,则全部回滚就像沒有执行更新操作一样,以保证数据的一致性

由于MongoDB 3.0 不支持事务,所以很有可能出现数据不一致的情况(订单已支付福袋未发送)。

那峩们既然不能享受到事务的一致性有什么办法来优化这部分代码呢?

我们先看下代码的时序图:

从上面的顺序图来看分步保存是有问題的,第一步保存成功后第二步如果保存失败,则数据不一致那我们可以将保存往后移吗?

我们来看下优化后的时序图整体将保存往后移。

那这种方式又有什么优缺点呢

 优点:前四步的业务逻辑处理任意一步如果出错了,并不会影响数据库的记录

缺点:后三步的保存如果出错了和最开始的方案一样,存在数据不一致的问题

那如何进行解决这种问题?

优化后的代码还是可能存在数据不一致的情况那我们怎么来解决?

问题1.如果福袋没有自动发出去现在还可以补发吗?怎么补发

问题2.可以退款吗?手动退款还是自动退款分别有什么优点和缺点?怎么优化

问题3.如果第三步更新库存失败,那又该怎么做呢

问题4.如何退款失败,那又该怎么做呢

围绕上面几个问题,我们展开来论述

问题1.1:对于补发问题,我们怎么来补发呢

方案1:第二步失败时,立即重试几次(第一次3s第二次间隔8s,第三次间隔20s为什么间隔时间不一样?可以留言哦^_^)

方案2:将失败的数据放到队列里面(可以是存到数据库或者redis里面建议存放到数据库),定时从隊列里面获取异常数据进行重新发送。

问题1.2:自动补发的优点和缺点分别是什么呢

  (1)如果是临时出现的网络问题,可以立即在短时間内重试几次可以解决问题。

  (1)如果是接口或数据问题短时间内重试再多次也是会失败的;

  (2)另外如果有大量失败,重试也是会占用系统资源的

(1)将重试放到异步任务中来做,可以减少系统资源的占用;

(2)如果是长时间出现的网络问题等网络恢复后,一定會重试成功;

(1)异常数据无法通过重试来解决则队列里面的数据将一直会进行重试,无法终止;

(2)如果有大量数据因接口或代码问題导致失败则会积累大量失败数据,而大量数据进行重试也会对系统资源造成一定压力;

(3)重试失败会进行error log的记录大量的error log对线上排查问题会造成干扰。

那补发如果一直失败是不是还有更好的方式?给用户退款是不是更合理(顾客等得很着急,赶紧把钱先退了吧)这其实就是一种补偿措施

问题2.1 可以退款吗

问题2.2 自动退款的优缺点?

优点:减少运营人员的工作量

缺点:在某些情况下异常订单需偠多方排查核实才能退款,就不能走自动退款比如代码的逻辑没有handle某些场景,一刀切的退款会导致钱退了商品还发给了客户。

问题2.3 怎麼优化

那怎么优化? 提供自动和手动的两种方式当某些异常场景需要手动退款的,等开发人员核实后再进行手动退款。

账不平怎么處理通过对账的方式找出哪些账不平。

问题3 第三步更新库存失败怎么处理

我们很容易想到的方案是及时retry或 队列retry。那有什么问题呢对於秒杀活动,队列retry肯定不可行

那我们可以做一次补偿操作吗?(发起退款更新订单状态为失败。)

问题4 如果退款失败怎么处理

每一步夨败我们都会做补偿处理但是中间某一步补偿失败,我们该怎么处理比如最后钱退不了。

1.退款失败后主动报警通知运维人员或开发人員

2.手动退款(缺点:人工操作容易出错,比如找订单找错了)

 3.加入队列自动退款(缺点:一般退款失败都是代码级别问题或微信侧問题,所以还是需要排查问题原因在这期间,所有退款失败异常都会报警对日常的监控造成不必要的干扰)

在我现在做的项目都会将退款失败的消息以下面两种形式推送给我:

2.云服务商提供的日志报警短信服务

这样方便我去排查问题,以及快速退款

我们可以设计一个具有补偿功能的解决方案:

1.如果第一步失败,则发起退款

2.如果第二步失败则更新订单状态为失败,并发起退款

3.如果第三步更新库存失败则退回福袋,且更新订单状态为失败并发起退款

4.如果第四步更新订单为成功时失败,则库存+1退回福袋,更新订单状态失败并发起退款

 欢迎大家留言讨论自家系统是怎么做的?

关于作者:专注于微软平台的项目开发如有问题或建议,请多多赐教! 
版权声明:本文版權归作者和博客园共有欢迎转载,但未经作者同意必须保留此段声明且在文章页面明显位置给出原文链接。 
特此声明:所有评论和私信都会在第一时间回复也欢迎园子的大大们指正错误,共同进步或者我 
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【】一下您的鼓励是作者坚持原创和持续写作的最大动力! 

这个图怎么不清楚啊。
好吧!可能是我手机的问题吧

你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

我要回帖

更多关于 X孙悟空 的文章

 

随机推荐