老师好,根据课程中这个流程图,个人有一个疑问,如果第二步grpc调用库存扣减逻辑执行成功,但是在返回时因为网络等问题(比如超时)导致的失败,是不是就会出现实际扣减了库存,但是没有生成订单。
登陆购买课程后可参与讨论,去登陆吧
这些问题课程中都有讲解过的, 如果网络问题导致实际上扣减成功,
如果返回网络有问题,本地会重试直到成功的
如果本地一直失败可以抛出异常的同时将之前发送的mq消息确认,消费者收到这条消息的时候会检查该订单是否已经扣减,如果已经扣减则归还。如果没有扣减成功则什么都不用做
如果返回的时候程序挂了,这个时候mq消息会不停的回查,当我们下一次启动的时候会检查消息是否需要提交,此时我们会检查本地order表来确定是否提交
所有总结来说就是无论如何都能达到数据最终一致性,另一方面我们的consumer需要记录order的扣减情况防止错误归还的问题
老师,我看了视频,然后又看了这里的回答,整体逻辑明白了,想了解一下:
对于第二步grpc直接调用扣库存那儿,如果实际扣减成功,而返回超时等异常情况,就对应你这里的第二点,本地事务rollback,然后MQ commit库存归还消息;在消费者那儿的归还库存逻辑怎么检查订单之前是否扣减成功?我的想法是扣库存接口那儿成功就建一个log表,记录个日志。那么归还库存时候,检查本地log表,查询是否Log表有扣减数据,来判断之前超时那儿到底扣减成功没。这样行吗?扣减成功就归还,并删除日志表的这条数据。
第二点是,结尾还发送了一个延时消息,超时归还库存,如果前面全部正确,最后延时消息发送失败咋办?延时消息应该也会包含在本地事务中吧?
这里确实要有log表,这个在课程中也是这样处理的
延时消息不用去管,你的消费者消费延时消息的时候应该先检查订单的状态,如果是已经支付的状态延时消息就直接丢弃就行了,只有等待支付的状态的订单才能归还,所以订单的状态很重要
第二点我没太明白,老师这里说的是消费者消费延时消息的处理逻辑,认为消息已经发送到MQ成功了。
其实我的意思是如果订单这里发送延时消息到MQ失败了的情况,那么订单服务的本地事务也应该要rollback吧,前面的库存也要归还,对吧~?最后这个发送延时消息也应该包含在本地事务里面吧,不然前面全部执行成功了,订单下了,库存也扣了,最后不支付,延时消息没有,不久永远锁住这里的库存数了吗?
我因为还没看到后面实际逻辑,所以对这里整体逻辑有点不清楚~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
登录后可查看更多问答,登录/注册
Google架构师ccmouse联合大厂架构师合作推出。两位架构师,跨行业项目,共享租车项目面向未来,三端分离电商立足当下,助你吃透Go全栈开发。抓住当下,面向未来蓝海行业,提前突破35岁职业瓶颈!
175 1
251 3
40 1
37 1
在线咨询
领取优惠
免费试听
领取大纲
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星