招联一面
项目里有一个类似秒杀的功能,面试官问我怎么考虑记录插进数据库失败,这该怎么考虑啊
全部评论
(秒杀问题中的一个方向,不一定是面试官真问的)
订单系统 和 商品库存系统 可能不在一个数据库或一个服务器上,不能用数据库事务完成,你必须自己保证两个系统的一致性,也就是要么订单创建成功、库存扣减也成功,要么两者都失败。如果库存扣完了,但订单创建失败,那你要保证库存加回来、且订单一定不会创建成功(至少之后要删掉它)(因为要及时响应用户,一直等订单服务响应是不可能的)。这个是典型的分布式事务问题。
难点在于,如果请求订单服务超时(不是直接返回插入失败),服务器短时间没法知道请求是失败了(订单不会创建成功),还是请求没有失败、只是被延迟了(订单之后又成功更新了)。
最简单的方法应该是,服务器重试几次、允许等一小段时间,如果还是超时或请求失败,就直接返回下单失败,撤销库存更新;然后开一个定时任务定期给订单服务发补偿信息(删除订单或标记订单无效,如果是库存服务超时就是加库存)直到这个消息被成功处理。
服务器的插入请求和补偿请求必须满足幂等性:重发插入请求不会导致一个订单被插入多次;重复发补偿不会导致订单被删多次(对库存服务就是库存被加多次)。并且要注意在订单真的创建后,才执行这个补偿。
意思是,先在缓存扣库存,之后扣减数据库库存失败么?
楼主投的什么岗啊
m
相关推荐
06-25 18:26
辽宁大学 实施工程师 点赞 评论 收藏
分享
06-03 19:26
西北农林科技大学 C++ 点赞 评论 收藏
分享
06-03 03:20
河北农业大学 人力资源专员/助理 点赞 评论 收藏
分享