基于可靠消息实现库存一致性课程问题

基于可靠消息实现库存一致性课程问题

https://img1.sycdn.imooc.com//climg/62adf37c09bc450609560682.jpg

老师好,根据课程中这个流程图,个人有一个疑问,如果第二步grpc调用库存扣减逻辑执行成功,但是在返回时因为网络等问题(比如超时)导致的失败,是不是就会出现实际扣减了库存,但是没有生成订单。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
bobby 2022-06-20 09:58:41

这些问题课程中都有讲解过的, 如果网络问题导致实际上扣减成功,

  1. 如果返回网络有问题,本地会重试直到成功的

  2. 如果本地一直失败可以抛出异常的同时将之前发送的mq消息确认,消费者收到这条消息的时候会检查该订单是否已经扣减,如果已经扣减则归还。如果没有扣减成功则什么都不用做

  3. 如果返回的时候程序挂了,这个时候mq消息会不停的回查,当我们下一次启动的时候会检查消息是否需要提交,此时我们会检查本地order表来确定是否提交

  4. 所有总结来说就是无论如何都能达到数据最终一致性,另一方面我们的consumer需要记录order的扣减情况防止错误归还的问题

  • 老师,我看了视频,然后又看了这里的回答,整体逻辑明白了,想了解一下:

    1. 对于第二步grpc直接调用扣库存那儿,如果实际扣减成功,而返回超时等异常情况,就对应你这里的第二点,本地事务rollback,然后MQ commit库存归还消息;在消费者那儿的归还库存逻辑怎么检查订单之前是否扣减成功?我的想法是扣库存接口那儿成功就建一个log表,记录个日志。那么归还库存时候,检查本地log表,查询是否Log表有扣减数据,来判断之前超时那儿到底扣减成功没。这样行吗?扣减成功就归还,并删除日志表的这条数据。

    2. 第二点是,结尾还发送了一个延时消息,超时归还库存,如果前面全部正确,最后延时消息发送失败咋办?延时消息应该也会包含在本地事务中吧?

    2023-03-24 14:33:05
    1. 这里确实要有log表,这个在课程中也是这样处理的

    2. 延时消息不用去管,你的消费者消费延时消息的时候应该先检查订单的状态,如果是已经支付的状态延时消息就直接丢弃就行了,只有等待支付的状态的订单才能归还,所以订单的状态很重要

    2023-03-24 19:13:53
  • 第二点我没太明白,老师这里说的是消费者消费延时消息的处理逻辑,认为消息已经发送到MQ成功了。

    其实我的意思是如果订单这里发送延时消息到MQ失败了的情况,那么订单服务的本地事务也应该要rollback吧,前面的库存也要归还,对吧~?最后这个发送延时消息也应该包含在本地事务里面吧,不然前面全部执行成功了,订单下了,库存也扣了,最后不支付,延时消息没有,不久永远锁住这里的库存数了吗?

    我因为还没看到后面实际逻辑,所以对这里整体逻辑有点不清楚~

    2023-03-24 22:50:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师